Angular:从惰性功能模块添加一个多提供者

标签 angular typescript angular-module

我有一个 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)
  ], ...

惰性加载子特性模块:

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

我希望将配置 ERROR_CONFIGERROR_CONFIG_CHILD 都注入(inject)到 ErrorModule 中定义的 ErrorService:

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

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

惰性功能模块已加载并初始化,ErrorModule.forChild(...) 已调用

当只有核心模块的 CONFIG 注入(inject) token 可用时,ErrorService 已及时构建,这是有道理的 - 功能模块尚未加载。

我还尝试在构造函数(ErrorService 中的方法)之外使用 Angular Injector 导入 CONFIG,结果是一样的。

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

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

最佳答案

我最终得到了一个解决方案,它使用 CoreModule 中定义的 ErrorService 在初始化 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);
    }
}

关于Angular:从惰性功能模块添加一个多提供者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52263603/

相关文章:

angular - 以这种方式在 Angular 中使用主题是否存在安全风险?

javascript - 如何在 Javascript 函数中返回动态(键,值)对

angular - 比较Angular 6中的两个日期

angular - NullInjectorError : No provider for DecimalPipe

angular - 如何使用 Angular 日期管道转换 firebase 时间戳

typescript - 如何使自定义管道可供 Angular 2 中的所有组件使用?

typescript - 依赖注入(inject) : recommended pattern for injecting NPM modules

json - "resolveJsonModule"的用途?

angular - 在 Angular 中根据条件加载 ngModule 及其组件