首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >角2.4.8 App_Initializer

角2.4.8 App_Initializer
EN

Stack Overflow用户
提问于 2017-03-01 13:29:32
回答 1查看 924关注 0票数 0

我使用从服务器加载数据的APP_INITIALIZER和带有CanActivate的保护程序。我使用角2.4.8,我看到在我的守护中的CanActivate在APP_INITIALIZER完成调用验证函数之前被调用.

这是正确的行为吗?

代码语言:javascript
复制
{ provide: APP_INITIALIZER, useFactory: (config: ContextService) => () =>  config.validate(), deps: [ContextService], multi: true }

函数config.validate()返回一个承诺。这里的代码

代码语言:javascript
复制
 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();
}

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-01 13:39:43

那么,你的问题的答案是yesno。版本2.4.8中的路由器已经更改,现在导航也在APP_INITIALIZER循环中启动,这意味着在ContextService工厂完成之前可能会触发CanActivate。路由(NavigationEnd)在所有APP_INITIALIZER任务完成之前不会被解析,但这可能不是您想要的。

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

  • 降级到2.4.7版本,因为他们意识到这不是解决方案,人们对此很满意,并且提交已经恢复
  • 将ContextService依赖项添加到CanActivate中,以便在工厂加载完数据之前不会激活(并解析)路由
  • 使用官方回购https://github.com/angular/angular/issues/14588解释的快速修复
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42533100

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档