Угловые AOT forRoot условно определяют провайдеры - PullRequest
0 голосов
/ 15 октября 2019

У нас есть forRoot, в котором мы условно создаем массив провайдеров на основе условий в объекте конфигурации. 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?

Ответы [ 2 ]

0 голосов
/ 15 октября 2019

Вы можете использовать фабрику и вернуть ноль в случае сбоя условия следующим образом:

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]
                }
            ]
        };
    }
}
0 голосов
/ 15 октября 2019

У меня была похожая проблема с AOT в Angular. Я не смог использовать функцию Array.push внутри метода forRoot.

В моем случае я переместил логику из метода forRoot и выполнил необходимые операции где-то снаружи. Затем я передал отфильтрованный массив провайдеров в forRoot.

Динамический массив провайдеров с forRoot

...