我想通过调用这样的静态函数来促进提供者的声明:
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,
...
],
})
答案 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},
],
};