Angular 2 提供者不使用 useValue 和函数调用 new
Angular 2 provider is not working with useValue and function call to new
我想知道为什么当我想通过 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
。
如有任何帮助,我们将不胜感激。干杯!
我知道这个错误听起来很神秘,但最终并非如此。
某些配置(通常是 aot-cli 的配置)不允许无法静态分析的代码。为了做到这一点,必须导出一个函数,就像错误状态一样,像这样
创建一个如下所示的 ts 文件
export function UseClassFunction(){ return function() { return new Foo(new Bar());}}
然后导入并在 useValue
上使用它
{provide: Base, useValue: UseClassFunction}
我想知道为什么当我想通过 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
。
如有任何帮助,我们将不胜感激。干杯!
我知道这个错误听起来很神秘,但最终并非如此。 某些配置(通常是 aot-cli 的配置)不允许无法静态分析的代码。为了做到这一点,必须导出一个函数,就像错误状态一样,像这样
创建一个如下所示的 ts 文件
export function UseClassFunction(){ return function() { return new Foo(new Bar());}}
然后导入并在 useValue
{provide: Base, useValue: UseClassFunction}