2

如果您尝试在装饰器中进行调用,Angular AoT 编译器会抛出错误。

考虑以下代码:

export function factoryBuilder(config: MyConfig) {
  return function customFactory() {
    return new MyService(config);
  };
}

@NgModule({})
export class MyModule {

  static forRoot(config: MyConfig): ModuleWithProviders {

    return {
      ngModule: MyModule,
      providers: [
        {
          provide: MyService,
          useFactory: factoryBuilder(config),
        }]
    };
  }
}

如果您尝试使用 aot 标志 (--prod) 构建它:

编译器说:

ERROR in Error during template compile of 'AppModule'
  Function expressions are not supported in decorators in 'MyModule'
   ...
    Consider changing the function expression into an exported function.

有人可以从技术上解释为什么编译器不能支持吗?

PS:此代码在 JiT 模式下工作。

4

1 回答 1

0

模块中不支持箭头函数(或 lambda),因为 AOT 编译器需要能够“静态地”分析模块。

使用普通function而不是箭头函数应该可以解决问题:

export function myFactory(config) { };

customFactory您可能还必须对返回的函数执行相同的操作myFactory

您可以在官方指南或此备忘单中找到有关 AOT 工作原理的更多信息。

于 2018-11-05T11:58:12.487 回答