我需要在应用程序引导之前从服务器获取配置。我能够在我的主要ngModule中的提供程序中使用它来做到这一点:
{
provide: APP_INITIALIZER,
useFactory: (links: Links) => () => links.init(),
deps: [Links, Http],
multi: true
}
链接服务:
init(): Promise<any> {
var observable = this.http.get('someUrl').map(res => res.json());
observable.subscribe(res => {
this.config = res;
});
return observable.toPromise();
}
此代码在应用程序引导之前执行,但在我的应用程序请求Links.config之后,服务器的响应才会出现。在Promise解决之后,如何强制应用程序不引导?我尝试过promise.resolve(),但它没有帮助。
我使用提供程序的方式我认为我强迫应用程序使用相同的Links实例,而且我认为数据已经存在。我做错了什么?
答案 0 :(得分:3)
在我的代码中,我做的完全相同,只是区别在于我在映射之前将请求转换为Promise。
public load(): Promise<void> {
let headers = new Headers({ 'Content-Type': 'application/json' });
let url = this.urls.settings;
return this.http.get(url, { headers }).toPromise().
then(configs => {
this.startupSettings = configs.json();
}).catch(err => {
log(err);
});
}
...............................
{
provide: APP_INITIALIZER,
useFactory: (config: StartupConfigurationService) => () => config.load(),
deps: [StartupConfigurationService],
multi: true
}
我不确定它是否有意义,但尝试可能会解决
答案 1 :(得分:2)
根据#37611549和#35215112的建议,@ngx-config/core实用程序可以帮助您在应用初始化期间从服务器获取配置。
通过在SystemJS导入中获取数据,您可以获得类似的结果。但是,我不建议采用这种方法 - 因为它会产生一种风险,即您的配置值在AoT编译期间无法进行静态分析。
答案 2 :(得分:0)
请查看我在这里使用过的工作
Loading server side settings angular2 2.0.1
简而言之,使用可以加载配置设置的Promise使用CanActivate类保护你的路线也应该有效。
确保在构造相应组件时可以使用您的设置。 (使用APP_INITIALIZER并没有限制被调用的构造函数,所以我不得不使用这个技术,另外请确保,你不要导出导出中的所有组件:模块中的[])