首页 > 解决方案 > 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 错误?

标签: angularangular-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]
                }
            ]
        };
    }
}

推荐阅读