为啥路由保护 canLoad 不会触发,但 canActivate 会

Posted

技术标签:

【中文标题】为啥路由保护 canLoad 不会触发,但 canActivate 会【英文标题】:Why does route guard canLoad not fire, but canActivate does为什么路由保护 canLoad 不会触发,但 canActivate 会 【发布时间】:2017-02-21 23:53:57 【问题描述】:

我有一个 Angular 2.0.1(最终版)应用程序,它使用 HashLocationStrategy 作为路线导航策略。

我将我的一条路线定义如下:

     
    path: 'shiftmanage', component: ShiftManageComponent,
    canLoad: [AuthGuard],
    canActivate: [AuthGuard] 
    ,

这里是 AuthGuard 类:

    import  Injectable            from '@angular/core';
    import  
        Route, 
        Router, 
        CanLoad, 
        CanActivate,
        ActivatedRouteSnapshot, 
        RouterStateSnapshot        from '@angular/router';

    @Injectable()
    export class AuthGuard implements CanLoad, CanActivate 
        constructor(private router: Router) 
            console.log("AuthGuard constructor")
        

        canLoad(route: Route): boolean 
            if (route.path === "shifts") 
                return true;
             else 
                return false;
                    
        

        canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean 
            if (route.routeConfig.path === "shiftmanage") 
                return true;
             else 
                return false;
            
        
    

然后我将这个守卫类添加到 NgModule Providers 中,如下所示:

providers: [
    AuthGuard,
     provide: LocationStrategy, useClass: HashLocationStrategy 
    ... other providers
]

导航正常工作,每当我尝试导航到 shiftmanage 路径时,都会触发 canActivate 路由保护。

问题: canLoad 路由守卫永远不会被击中。

问题:

这个 canLoad 守卫没有因为 HashLocationStrategy 被击中,还是我做错了什么?

【问题讨论】:

【参考方案1】:

canLoad用于加载lazy-loaded modules和loadChildren


  path: 'child',
  canLoad: [AuthGuard],
  loadChildren: 'path/to/child.module'

【讨论】:

好的,在仔细阅读链接的文档之后,这是有道理的,谢谢

以上是关于为啥路由保护 canLoad 不会触发,但 canActivate 会的主要内容,如果未能解决你的问题,请参考以下文章

Angular CanLoad 防护仅在第一次延迟加载时触发一次?

导航栏不会根据路由条件在 app.js 中呈现。路由更改时不会触发 Useeffect

在 vue-router 中静默更新 url 而不会触发路由

为啥我把 DELETE 路由器放在 GET 之后,DELETE 端点没有被触发

为啥我的 Vue 导航栏更改了路由但没有更新路由器视图?

为啥带有 useContext 触发器的自定义路由 HOC 会重新渲染?