Angular: добавить мульти-провайдера из ленивого функционального модуля - PullRequest
0 голосов
/ 10 сентября 2018

У меня ErrorModule (eager) настроен следующим образом:

export const CONFIG = new InjectionToken<ErrorConfig[]>('Module errors configuration.');


@NgModule({
  imports: [... ]
})
export class ErrorModule {
  static forRoot(config: ErrorConfig): ModuleWithProviders {
    return {
      ngModule: ErrorModule,
      providers: [
        ErrorService,
        { provide: HTTP_INTERCEPTORS, useClass: ErrorInterceptor, multi: true },
        { provide: CONFIG, useValue: config, multi: true }
      ]
    };
  }

  static forChild(config: ErrorConfig): ModuleWithProviders {
    return {
      ngModule: ErrorModule,
      providers: [
        { provide: CONFIG, useValue: config, multi: true }
      ]
    };
  }
}

Затем основной модуль импортирует ErrorModule следующим образом:

@NgModule({
  imports: [
    ErrorModule.forRoot(ERROR_CONFIG)
  ], ...

Lazy загружендочерний функциональный модуль:

@NgModule({
  imports: [
    ErrorModule.forChild(ERROR_CONFIG_CHILD)
  ], ...

Я хотел бы видеть обе конфигурации ERROR_CONFIG и ERROR_CONFIG_CHILD, введенные в ErrorService, определенные в ErrorModule :

@Injectable
export class ErrorService {
    constructor(@Inject(CONFIG) private readonly errorConfigs: ErrorConfig[])
}

Но сервис errorConfigs (в конструкторе) содержит только CONFIG, определенный в core.module - тот, который определен в функции forRoot() (массив с одним элементом).

Модуль отложенных функцийбыл загружен и инициализирован, а ErrorModule.forChild(...) вызвано

Имеет смысл, что ErrorService был создан в то время, когда был доступен только токен инжекции CONFIG основного модуля - функциональный модульеще не загружен.

Я также пытался импортировать CONFIG, используя Angular Injector вне конструктора (метод в ErrorService), и результат был таким же.

const configs: any[] = injector.get(CONFIG); // returns only root CONFIG

Итак, мой вопрос: возможно ли как-то получить доступ к провайдеру?ленивый модуль в модуле приложения?(Доступ к нему в корневом инжекторе приложения?)

1 Ответ

0 голосов
/ 11 февраля 2019

Я получил решение, которое использует ErrorService, определенное в CoreModule, для регистрации конфигураций при инициализации FeatureModule:

import { ErrorService } from '@core/error.service';

@NgModule({
    imports: [ CommonModule, ForFeatureModule, TranslateModule.forChild() ],
    declarations: [FeatureModule],
    providers: []
})
export class FeatureModule {
    constructor(
        private readonly translate: TranslateService, private readonly errorService: ErrorService) {
        translate.setTranslation('cz', i18n, true);

        // --- HERE --- errorService configures global error configuration
        errorService.addErrorMappings('FEATURE1', ERROR_MAPPING);
    }
}
...