我使用APP_INITIALIZER从服务器加载数据,使用CanActivate加载一名后卫。我使用Angular 2.4.8,我看到我的守护中的CanActivate被称为BEFORE APP_INITIALIZER完成调用验证函数...
这是正确的行为吗?
{ provide: APP_INITIALIZER, useFactory: (config: ContextService) => () => config.validate(), deps: [ContextService], multi: true }
函数config.validate()返回一个promise。这里是代码
validate() {
return Observable.forkJoin(
this.http.get('/api/v1/check').map(res => res.json()),
this.http.get('/api/v1/me').map(res => res.json())
).map(
data => {
console.log("data loaded");
... stuff ...
return this.hasValidLicence;
}).toPromise();
}
由于
答案 0 :(得分:1)
嗯,回答你的问题是是和没有。版本2.4.8中的路由器已更改,现在导航也在 APP_INITIALIZER 循环中启动,这意味着在ContextService工厂完成之前可能会触发CanActivate。在所有APP_INITIALIZER任务完成之后,Route(NavigationEnd)将无法解决,但可能不是您想要的。
如果要在完成加载/导航到页面之前确保数据存在,您可以执行以下操作之一: