用. forroot()配置一个外部Angular库,它依赖于一个主应用服务来填充配置值



我有一个自定义库,需要在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)

相关内容

  • 没有找到相关文章

最新更新