Angular: 从惰性功能模块添加一个多供应商
Angular: add a multi provider from lazy feature 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_CONFIG
和 ERROR_CONFIG_CHILD
注入到 ErrorModule:
中定义的 ErrorService
@Injectable
export class ErrorService {
constructor(@Inject(CONFIG) private readonly errorConfigs: ErrorConfig[])
}
但服务的 errorConfigs
(在构造函数中)仅包含 core.module
中定义的 CONFIG
- 在 forRoot()
函数中定义的那个(具有一个元素的数组)。
惰性功能模块已加载并初始化,ErrorModule.forChild(...)
已调用
当只有核心模块的 CONFIG
注入令牌可用时 ErrorService
及时构建是有道理的 - 功能模块尚未加载。
我也尝试在构造函数(ErrorService
中的方法)之外使用 Angular Injector
导入 CONFIG
,结果是一样的。
const configs: any[] = injector.get(CONFIG); // returns only root CONFIG
所以我的问题是:是否有可能以某种方式访问应用程序模块中惰性模块提供的提供程序? (在应用程序的根注入器中访问它?)
我最终找到了一个解决方案,它使用 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);
}
}
我有一个 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_CONFIG
和 ERROR_CONFIG_CHILD
注入到 ErrorModule:
ErrorService
@Injectable
export class ErrorService {
constructor(@Inject(CONFIG) private readonly errorConfigs: ErrorConfig[])
}
但服务的 errorConfigs
(在构造函数中)仅包含 core.module
中定义的 CONFIG
- 在 forRoot()
函数中定义的那个(具有一个元素的数组)。
惰性功能模块已加载并初始化,ErrorModule.forChild(...)
已调用
当只有核心模块的 CONFIG
注入令牌可用时 ErrorService
及时构建是有道理的 - 功能模块尚未加载。
我也尝试在构造函数(ErrorService
中的方法)之外使用 Angular Injector
导入 CONFIG
,结果是一样的。
const configs: any[] = injector.get(CONFIG); // returns only root CONFIG
所以我的问题是:是否有可能以某种方式访问应用程序模块中惰性模块提供的提供程序? (在应用程序的根注入器中访问它?)
我最终找到了一个解决方案,它使用 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);
}
}