在 @NgModule 装饰器中调用函数

Har*_*vic 5 angular

我正在研究如何调用 @NgModule 装饰器内的函数。

出于我的目的,我希望能够调用内置于角度核心中的 isDevMode() 函数。

因此,在 @NgModule 中,我尝试根据该导入或非特定模块进行条件检查,我是处于开发模式还是生产模式。

解决方法可以是简单地将生产标志添加到环境文件中,但在我的情况下它不应该工作。

原因是因为对于某些环境,我希望能够动态地将生产标志设置为 true 或 false。因此, isDevMode() 函数已经基于 ng build 或 ngserve 期间传递的 --prod 标志来执行此操作,但问题是我无法执行以下操作:

@NgModule({
  imports: [
    ....
    isDevMode() : TestModule : []
    ....
]});
Run Code Online (Sandbox Code Playgroud)

如果我想获得符合 AOT 标准的应用程序,我会收到错误消息。

原因很明显,因为 NgModule 需要静态内容并且禁止函数调用,但我想知道是否有任何解决方法。

错误:

ERROR in app/app.module.ts(169,5): Error during template compile of 'AppModule'
  Function calls are not supported in decorators but 'isDevMode'
Run Code Online (Sandbox Code Playgroud)

Pav*_* B. 0

forRoot理论上,您可以使用返回模块定义的静态方法创建一个模块。

像这样:

@NgModule({
})
export class SharedModule {
  static forRoot(): ModuleWithProviders {
    var data = {
      ngModule: SharedModule,
      imports: [],
      exports: []
    };
    if(condition) {
      data.imports.push(YourModuleToExport);
      data.exports.push(YourModuleToExport);
    }
    return data;
  }
}
Run Code Online (Sandbox Code Playgroud)

我不是 100% 确定,因为我从来没有用过这种方式,但我应该工作得很好。

最后一件事是你可能不得不使用import(path).then(mod => mod.YourModuleToExport)而不是YourModuleToExport. 所以模块将得到lazy-loaded.

然后您应该能够在模块导入中使用 forRoot 方法,就像使用 RouterModule 时一样。

imports: [
   SharedModule.ForRoot()
]
Run Code Online (Sandbox Code Playgroud)

来源:https ://medium.com/slackernoon/when-to-use-angulars-forroot-method-400094a0ebb7