【问题标题】:Angular provider not provided in AOTAOT 中未提供 Angular 提供程序
【发布时间】:2018-02-01 01:20:27
【问题描述】:

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

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,
    ...
  ],
})

【问题讨论】:

标签: angular typescript angular2-aot


【解决方案1】:

是的,这是因为模块声明/使用的任何内容都应该是可静态分析的,AOT 才能正常工作。请参阅this 了解更多信息

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

,您无法从函数中推断出任何返回值

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

【讨论】:

    【解决方案2】:

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

    import { NgModule, ModuleWithProviders } from '@angular/core';
    
    // ....
    
    public static withValue(value: string): ModuleWithProviders {
      return {
        ngModule: MyModule,
        providers: [
          { provide: MY_TOKEN, useValue: value},
        ],
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-01
      • 2020-05-15
      • 2015-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多