Angular 2提供程序不使用useValue和函数调用new

时间:2017-05-19 15:44:17

标签: angular dependency-injection angular-module

我想知道为什么当我想通过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

非常感谢任何帮助。干杯!

1 个答案:

答案 0 :(得分:3)

我知道这个错误听起来很神秘,但最终却没有。 某些配置(通常是aot-cli配置)不允许无法静态分析的代码。为了做到这一点,必须导出一个函数,就像错误状态一样,如此

创建一个看起来像这样的

的ts文件

export function UseClassFunction(){ return function() { return new Foo(new Bar());}} 然后导入它并在useValue上使用它

{provide: Base, useValue: UseClassFunction}