我想知道为什么当我想通过useValue
字段提供特定值时,Angular 2提供程序语法不起作用。
例如,在app.module.ts中我有
// Abstracted base class (since interfaces don't work with libraries and tsc)
export class Base {
constructor(public bar:Bar) {
}
}
export class Foo extends Base {
constructor(public bar:Bar) {
super(bar);
}
}
export class Bar {
hello = "world";
}
@NgModule({
declarations: [
AppComponent,
],
imports: [
],
providers: [
{provide: Base, useValue: new Foo(new Bar())}
],
bootstrap: [AppComponent]
})
export class AppModule {
}
尝试此操作会在ng build
:
ERROR in Error encountered resolving symbol values statically. Calling function 'Foo', function calls are not supported. Consider replacing the function or lambda with a reference to an exported function, resolving symbol AppModule in /Users/tbeauvais/Code/example-sdk/src/app/app.module.ts, resolving symbol AppModule in /Users/tbeauvais/Code/example-sdk/src/app/app.module.ts
我通过简单地使用字段useClass
,然后通过deps
指定参数来解决这个问题:
...
providers: [
Bar,
{provide: Base, useClass: Foo, deps:[Bar]}
],
...
它有效,它只是不理想,我想知道我在这里缺少什么。此外,我不想无缘无故地注入Bar
。
非常感谢任何帮助。干杯!
答案 0 :(得分:3)
我知道这个错误听起来很神秘,但最终却没有。 某些配置(通常是aot-cli配置)不允许无法静态分析的代码。为了做到这一点,必须导出一个函数,就像错误状态一样,如此
创建一个看起来像这样的
的ts文件
export function UseClassFunction(){ return function() { return new Foo(new Bar());}}
然后导入它并在useValue上使用它
{provide: Base, useValue: UseClassFunction}