angular – 试图理解CanActivate和CanActivateChild之间的差异

前端之家收集整理的这篇文章主要介绍了angular – 试图理解CanActivate和CanActivateChild之间的差异前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
所以,我试图通过使用警卫来保护对多条路线的访问.我正在使用以下路由来执行此操作:
const adminRoutes : Routes = [
  {
    path: 'admin',component: AdminComponent,canActivate: [ AuthGuardService ],children : [
      {
        path: '',canActivateChild: [ AuthGuardService ],children: [
          { path: 'edit',component: DashboardComponent},{ path: '',component: DashboardComponent}
        ]
      }
    ]
  }
];

以下是AuthGuardService的外观

import { Injectable } from '@angular/core';
import {CanActivate,Router,ActivatedRouteSnapshot,RouterStateSnapshot} from "@angular/router";

@Injectable()
export class AuthGuardService implements CanActivate{

  constructor(private router: Router) { }

  canActivate(route: ActivatedRouteSnapshot,state: RouterStateSnapshot){
    console.log("Guarding...");
    return this.sessionValid();
  }

  canActivateChild(route: ActivatedRouteSnapshot,state: RouterStateSnapshot){
    console.log("Guarding children...");
    return this.canActivate(route,state);
  }

  sessionValid() : boolean {
    //tests
  }

}

当我尝试仅使用canActivate访问’/ admin’和’/ admin / edit’时(canActivateChild被注释)控制台显示

Guarding...

当我删除canActivate并带来canActivateChildback时,控制台会显示

Guarding children...

当我同时保留两者时,它会回到展示守卫……
那么,我的问题是,当canActivate保护根元素和子元素时,拥有canActivateChild的目的是什么?

PS:我知道canActivateChild在激活子路由之前运行.但那有什么好处呢?是不是只保留其中一个?

两者都很重要,因为您可能有不同的要求,用户可以访问根组件,但可能不满足子组件的条件.

示例:您可能遇到必须通过身份验证才能导航到根组件的情况,但必须具有权限“x”才能访问子组件.在这种情况下,canActivateChild可以节省大量的输入,因为必须为每个孩子添加canActivate防护.

编辑:

例如,您可能有一个管理模块,其中所有路由都需要防止未经授权的进入:

{
    path: 'admin',component: ...,},{
        path: 'manage-users',{
        path: 'manage-roles',}
    ]
  }

这需要从上到下保护.未经授权访问任何路由,包括root和children.在这种情况下,在根级别激活可以很好地保护一切.

但是,您可能还有一些功能模块,其中只需要保护某些孩子:

{
    path: 'featureA',children : [
      {
        path: 'manage-feature',{
        path: 'manage-members',}
    ],{path: 'featureB',component: ...}
  }

在这种情况下,也许所有用户都需要访问根组件的featureA’和’featureB’,但只有某些用户需要能够导航到’featureA’的子路由.在这种情况下,更容易在根级别使用一个防护装置来保护儿童,而不是根本身.另一种方法是将canActivate防护装置放在每个子路线上,这可能会变得乏味.

这完全取决于您的要求,但是拥有canActivate和canActivateChild两个选项会很不错.

猜你在找的Angularjs相关文章