Настройте внешнюю библиотеку Angular с помощью .forRoot(), которая зависит от основной службы приложения для заполнения значений конфигурации.

У меня есть настраиваемая библиотека, для которой требуется настраиваемая конфигурация в модуле библиотеки 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 и фабрику для заполнения данных, которые нужны модулю. Я не буду вводить ConfigService внутри FormatModule, потому что это сделает FormatModule зависимым от другой внешней службы.

1 ответ

определить токен инъекции

      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)
Другие вопросы по тегам