角度:从慵懒的功能模块添加了多供应商

问题描述 投票:1回答:1

我有一个ErrorModule(渴望)配置如下:

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)
  ], ...

延迟加载子功能模块:

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

我想看看ERROR_CONFIGERROR_CONFIG_CHILD注入到ErrorModule定义ErrorService两种配置:

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

errorConfigs函数中定义的一个(有一个元素的数组) - 但该服务的CONFIG(在构造函数)包含在core.module只有forRoot()定义。

懒惰的功能模块已经被加载并初始化ErrorModule.forChild(...)调用

它种有意义的ErrorService发生时间先后已建成时只有核心模块的CONFIG注射令牌可用 - 该功能模块没有beeen尚未加载。

我也试图导入使用构造之外角CONFIG(方法Injector)的ErrorService,结果是一样的。

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

所以我的问题是:是否有可能以某种方式访问​​由应用程序模块懒惰模块提供的供应商? (访问它在应用程序的根注射器?)

angular typescript angular-module
1个回答
2
投票

我结束了一个解决方案,其使用在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);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.