我正在研究如何调用 @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)
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
| 归档时间: |
|
| 查看次数: |
1322 次 |
| 最近记录: |