【问题标题】:Angular 2.4.8 App_InitializerAngular 2.4.8 App_Initializer
【发布时间】:2017-03-07 05:29:24
【问题描述】:

我使用 APP_INITIALIZER 从服务器加载数据并使用 CanActivate 保护。我使用 Angular 2.4.8,我看到我的后卫中的 CanActivate 在 APP_INITIALIZER 完成调用验证函数之前被调用...

这是正确的行为吗?

{ provide: APP_INITIALIZER, useFactory: (config: ContextService) => () =>  config.validate(), deps: [ContextService], multi: true }

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

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

谢谢

【问题讨论】:

标签: angular


【解决方案1】:

嗯,对您的问题的回答是。 2.4.8 版中的路由器已更改,现在导航也在 APP_INITIALIZER 循环中开始,这意味着可能会在您的 ContextService 工厂完成之前触发 CanActivate。在所有 APP_INITIALIZER 任务完成之前,不会解析路线 (NavigationEnd),但这可能不是您想要的。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-25
    • 2021-09-28
    • 2018-09-17
    • 1970-01-01
    • 2018-07-22
    • 2018-03-31
    相关资源
    最近更新 更多