Мне нужно сделать среду приложения Angular независимой, поэтому я реализовал функцию в app.module.ts
, которая выбирает файл конфигурации из файловой системы:
export function load(http: HttpClient, configService: ConfigService): () => Promise<boolean> {
return (): Promise<boolean> => {
return new Promise<boolean>(
(resolve: (a: boolean) => void): void => {
http
.get('./assets/config.json')
.pipe(
map((config: ConfigModel) => {
configService.config = config;
resolve(true);
}),
catchError(
(x: { status: number }, caught: Observable<void>): ObservableInput<{}> => {
if (x.status !== 404) {
resolve(false);
}
console.log('Config file could not be loaded, thus using default configuration.');
configService.config = configService.defaultConfig;
resolve(true);
return of({});
}
)
)
.subscribe();
}
);
};
}
В разделе поставщиков app.module.ts
Я объявляю провайдера, чтобы приложение загружало конфигурацию до запуска приложения:
providers: [
ConfigService,
{
provide: APP_INITIALIZER,
useFactory: load,
multi: true,
deps: [HttpClient, ConfigService]
}
]
Использование динамически заполненного конфига в компонентах работает хорошо, просто вставив ConfigService
и вызвав .config
для них.
Теперь я сталкиваюсь с проблемой, когда мне нужно предоставить конфигурацию для метода forRoot()
модуля в операторах импорта app.module.ts
:
imports: [
NgMsAdalModule.forRoot(## I need configService.config.adalConfig here! ##)
]
Как сделать ConfigService
доступно в модуле NgModule
в декораторе?