因此,我试图通过使用警卫来保护对几条路线的访问。我使用以下途径可以这样做:试图了解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
(canActivateChild
被注释掉)的控制台显示
Guarding...
当我删除canActivate
,并把canActivateChild
回控制台DISPLA ys
Guarding children...
当我保持这两者时,它会返回到显示Guarding...
。 所以,我的问题是canActivate
保护根元素和孩子时,有什么目的canActivateChild
?
PS:我知道canActivateChild
在孩子路线被激活之前运行。但是,这有什么好处?是不是只保留其中一个足够?
我们不能只使用canActivate而不是canActivateChild吗? – YounesM
也许,这取决于您的要求。我上面给出的例子可能有点太过于人为设计。 'canActivateChild'在每个子路由被激活之前运行。你确实可以使用'canActivate'来保护一个所有孩子的根组件,但是你可能有孩子,某些用户不需要查看他们何时需要能够看到根组件。例如,您可以将一些管理组件中的数据添加到大多数或所有用户需要到达根目录的Feature模块中,但不一定是某些路由的子模块。 –