Angular:如何正确实现 APP_INITIALIZER [英] Angular: How to correctly implement APP_INITIALIZER
问题描述
我有一个 Angular 5.2.0 应用程序.我查找了如何实现 APP_INITIALIZER
在应用程序启动之前加载配置信息.这里是 app.module
的摘录:
I have a Angular 5.2.0 application.
I looked up how to implement APP_INITIALIZER
to load configuration information before the app starts.
Here an extract of the app.module
:
providers: [
ConfigurationService,
{
provide: APP_INITIALIZER,
useFactory: (configService: ConfigurationService) =>
() => configService.loadConfigurationData(),
deps: [ConfigurationService],
multi: true
}
],
这里是configuration.service
:
import { Injectable, Inject } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Configuration } from './configuration';
@Injectable()
export class ConfigurationService {
private readonly configUrlPath: string = 'Home/Configuration';
private configData: Configuration;
constructor(
private http: HttpClient,
@Inject('BASE_URL') private originUrl: string) { }
loadConfigurationData() {
this.http
.get<Configuration>(`${this.originUrl}${this.configUrlPath}`)
.subscribe(result => {
this.configData = {
test1ServiceUrl: result["test1ServiceUrl"],
test2ServiceUrl: result["test2ServiceUrl"]
}
});
}
get config(): Configuration {
return this.configData;
}
}
以下是使用 configData
的组件构造函数示例:
Here is an example of a constructor of a component where the configData
is used:
export class TestComponent {
public test1ServiceUrl: string;
constructor(public configService: ConfigurationService) {
this.test1ServiceUrl = this.configService.config.test1ServiceUrl;
}
}
它适用于
中定义的所有组件.但是在
之外的组件中的相同实现不起作用.
当我调试组件的相应构造函数时它不起作用,它说 configService
是 null
.
为什么 APP_INITIALIZER
会在
内部的组件构造函数之前执行,而不是在组件的构造函数之前执行
之外?
It works fine with all the components which are defined within the <router-outlet></router-outlet>
. But the same implementation in a component outside the <router-outlet></router-outlet>
does not work.
When I debug the respective constructor of the component where it does not work it says that configService
is null
.
Why is the APP_INITIALIZER
executed before the constructor of a component inside the <router-outlet></router-outlet>
is called but not before the constructor of a component outside the <router-outlet></router-outlet>
?
推荐答案
由于 APP_INTIALIZER
有效,预计异步初始化程序会返回承诺,但是您对 APP_INTIALIZER
multiprovider 的实现不会因为loadConfigurationData
函数不返回任何内容.
Due to how APP_INTIALIZER
works, it's expected that asynchronous initializers return promises, but your implementation of APP_INTIALIZER
multiprovider doesn't because loadConfigurationData
function doesn't return anything.
它应该是这样的:
loadConfigurationData(): Promise<Configuration> {
return this.http.get<Configuration>(`${this.originUrl}${this.configUrlPath}`)
.do(result => {
this.configData = result;
})
.toPromise();
}
这篇关于Angular:如何正确实现 APP_INITIALIZER的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!