Angular 2.4.8 App_Initializer

时间:2017-03-01 13:29:32

标签: angular

我使用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();
}

由于

1 个答案:

答案 0 :(得分:1)

嗯,回答你的问题是没有。版本2.4.8中的路由器已更改,现在导航也在 APP_INITIALIZER 循环中启动,这意味着在ContextService工厂完成之前可能会触发CanActivate。在所有APP_INITIALIZER任务完成之后,Route(NavigationEnd)将无法解决,但可能不是您想要的。

如果要在完成加载/导航到页面之前确保数据存在,您可以执行以下操作之一:

  • 降级到版本2.4.7,因为他们意识到这不是人们满意的解决方案,并且已经恢复了提交
  • 向您的CanActivate添加ContextService依赖关系,以便在工厂完成加载数据之前不激活(并解决)路由
  • 使用官方回购https://github.com/angular/angular/issues/14588
  • 解释的快速修复