我有一个自定义库,需要在forRoot()库模块中进行自定义配置,但我需要使用一个应用配置模块来异步加载该配置,而不是使用静态注入数据,如下所示。
// Custom Library module
@NgModule({})
export class FormatModule {
constructor() {}
public static forRoot(config: FormatConfig) {
// Do something with the config
}
}
其中FormatConfig如下:
export interface FormatConfig {
[key: string]: any
}
该模块在主AppModule中的使用:
export function loadConfig(configService): Observable<FormatConfig> {
return configService.extractFormatConfig();
}
@NgModule({
declarations: [
AppComponent
],
imports: [
FormatModule.forRoot(),
BrowserModule,
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
我也有一个注入令牌分配配置数据:
export const FORMAT_CONFIG = new InjectionToken<string>('FORMAT_CONFIG');
可以使用forRoot方法和工厂来填充模块所需的数据。我不会在FormatModule中注入ConfigService,因为那样会使FormatModule依赖于另一个外部服务。
定义注入令牌
export const FORMAT_CONFIG: InjectionToken<FormatConfig> = new InjectionToken<FormatConfig>('FORMAT_CONFIG');
在声明AppModule
时使用工厂export function loadConfig(configService: ConfigService): Observable<FormatConfig> {
return configService.extractFormatConfig();
}
@NgModule({
declarations: [
AppComponent
],
imports: [
FormatModule.forRoot(),
BrowserModule,
],
providers: [{
provide: FORMAT_CONFIG,
useFactory: loadConfig,
deps: [ConfigService]
}],
bootstrap: [AppComponent]
})
export class AppModule { }
现在你可以将你的配置注入到你的FormatModule
中,如下所示
…
constructor(@Inject(FORMAT_CONFIG) private formatConfig: FormatConfig)