我有一个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_CONFIG
和ERROR_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
所以我的问题是:是否有可能以某种方式访问由应用程序模块懒惰模块提供的供应商? (访问它在应用程序的根注射器?)
我结束了一个解决方案,其使用在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);
}
}