angular - Angular AOT forRoot 有条件地定义提供者
问题描述
我们有一个 forRoot,我们在其中根据配置对象中的条件有条件地构建一个 providers 数组。AOT 不喜欢这样并返回错误“装饰器不支持函数调用,但调用了‘XxxModule’”。
forRoot(config: MyModuleOptions){
const providers = [
AService,
BService
];
// here we check some config options to define which other things we inject
if(config.behaviorC){
providers.push(CService);
}
return {
ngModule: MyModule,
providers: providers
};
}
我们如何解决这个问题或使用其他方法来避免 AOT 错误?
解决方案
如果条件失败,您可以使用工厂并返回 null,如下所示:
import { NgModule, ModuleWithProviders, Injector } from '@angular/core';
import { CoreModuleOptions } from './core.module-options';
import { CoreService } from './core.service';
export function coreServiceFactory(injector: Injector, options: CoreModuleOptions){
return options.condition ? new CoreService() : null;
}
@NgModule({
})
export class CoreModule {
static forRoot(config?: CoreModuleOptions): ModuleWithProviders {
return {
ngModule: CoreModule,
providers: [
{
provide: CoreModuleOptions,
useValue: config
},
{
provide: CoreService,
useFactory: coreServiceFactory,
deps:[ Injector, CoreModuleOptions]
}
]
};
}
}
推荐阅读
- angular - 简单的 Angular 9 项目编译整个 Angular 材料(es2015 为 esm2015)
- python - Pandas TypeError: unhashable type: 'slice' / 'DataFrame' object has no attribute 'flatten'
- python - 如何访问在函数中生成的列表?
- php - Cron 作业在 5 天后更新行
- r - 使用 r 将多个 csv 文件导入 postgresql 数据库(内存错误)
- matlab - Simulink/Matlab 错误:“在时间 2.084275 块 'project/Subsystem/Transfer Fcn' 中状态 '1' 的导数不是有限的......”
- python - 布尔值从 false 切换到 true 的日期列表
- wordpress - 在 nuxt + laravel + passport + wordpress 之间共享登录
- google-chrome-extension - Chrome浏览器扩展的推送通知?
- javascript - 视频 | Javascript:如何以日期格式访问密钥?