AOT中未提供Angular提供程序

时间:2018-01-30 10:31:32

标签: angular typescript angular2-aot

我想通过调用这样的静态函数来促进提供者的声明:

const provider = MyModule.makeProvider();

@NgModule({
  bootstrap: [AppComponent],
  declarations: [AppComponent],
  imports: [
     ...
  ],
  providers: [
    provider,
    ...
  ],
})

但它失败了AOT(缺少提供者)

虽然这有效:

const providers = [{provide : myToken, useValue: "value"}];

@NgModule({
  bootstrap: [AppComponent],
  declarations: [AppComponent],
  imports: [
     ...
  ],
  providers: [
    provider,
    ...
  ],
})

2 个答案:

答案 0 :(得分:0)

是的,这是因为模块声明/使用的任何内容都应该是静态可分析的,以便AOT能够正常工作。有关详细信息,请参阅this

我们通过静态分析可以理解什么?这意味着另一个程序不必运行函数来理解某个值可能是什么,因为它可以从代码本身推断出来。由于着名的Halting Problem

,您无法推断函数的任何返回值

当你运行一个函数来获取提供者时,AOT编译器会感到困惑。这也指动态模板/ css样式声明

答案 1 :(得分:0)

作为解决方法,我在模块中添加了一个静态函数。此函数返回ModuleWithProviders,如下所示:

import { NgModule, ModuleWithProviders } from '@angular/core';

// ....

public static withValue(value: string): ModuleWithProviders {
  return {
    ngModule: MyModule,
    providers: [
      { provide: MY_TOKEN, useValue: value},
    ],
};