【问题标题】:Making AoT compatible DI使 AoT 兼容 DI
【发布时间】:2017-02-18 06:55:52
【问题描述】:

我有一个使用 angular rc4 的工作项目,在将其更新为 angular 2.0.0 后崩溃了

我遇到以下错误:

静态解析符号值时遇到错误。调用函数 'createStore',不支持函数调用。考虑更换 引用导出函数的函数或 lambda, 解析符号appStore

这段代码不再有效:

//Redux - ReduxThunk - rootReducer
import { Store, createStore, applyMiddleware } from 'redux';
import ReduxThunk  from 'redux-thunk';
import { rootReducer } from '../modules/rootReducer';

const appStore = createStore(
  rootReducer,
  applyMiddleware(ReduxThunk)
)

@NgModule({
...
  providers: [
    { provide: 'AppStore', useValue: appStore }
  ]
})

解决这个问题的最佳方法是什么?

这是我在 app.ts 中使用 angular rc4 的根组件的文件

import { Component, provide } from '@angular/core';
import { Platform, ionicBootstrap } from 'ionic-angular';
import { StatusBar } from 'ionic-native';

//For Navigation
import { TabsPage } from './pages/tabs/tabs';

//Redux
import { createStore, applyMiddleware } from 'redux';
import ReduxThunk  from 'redux-thunk';
import rootReducer from './modules/rootReducer';

const appStore = createStore(
  rootReducer,
  applyMiddleware(ReduxThunk)
);

@Component({
  template: `<ion-nav [root]="tabsPage"></ion-nav>`
})

export class MyApp {

    private tabsPage: any;

    constructor(
        private platform:Platform, 
        @Inject('AppStore') private appStore: any
        ) {
        });

        this.tabsPage = TabsPage;

        platform.ready().then(() => {
            // Okay, so the platform is ready and our plugins are available.
            // Here you can do any higher level native things you might need.
            StatusBar.styleDefault();
        });
    }   
}

ionicBootstrap(MyApp, [
    provide('AppStore', { useValue: appStore })
])

【问题讨论】:

  • 你试过用useFactory: () =&gt; createStore(...)替换useValue吗?
  • 是的,它给了我同样的错误:遇到静态解析符号值的错误。不支持函数调用。考虑将函数或 lambda 替换为对导出函数的引用(原始 .ts 文件中的位置 105:19)

标签: angular typescript dependency-injection ionic2 angular2-aot


【解决方案1】:

如果在 createStore 函数中的任何地方使用了未命名/未导出的函数,您将得到同样的错误 - 很可能就是这种情况。我认为你有两个选择:

1。尝试修改您的代码,希望问题出在您的代码中。

我会像@estus 推荐的那样尝试useFactory,但您必须使用命名函数,而不是匿名函数。它必须是函数引用,而不是指向函数的 const。

export function appStore() {
  return createStore(
    rootReducer,
    applyMiddleware(ReduxThunk)
  );
}

@NgModule({
...
  providers: [
    { provide: 'AppStore', useFactory: appStore }
  ]
})

2。尝试使用更 Angular 2 友好的 redux 实现

我正在使用ngrx,它运行良好。 ng2-redux 是另一种选择,但我没有尝试过。

【讨论】:

  • 我已经用 Redux 编写了所有程序,所以我更喜欢第一个选项,而且它现在似乎正在工作。非常感谢您的回答。我通过函数引用进行了测试,但使用的是 useValue 而不是 useFactory。我已经坚持了一个多星期了!再次感谢。 :)
猜你喜欢
  • 1970-01-01
  • 2013-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多