그래서 저는 경비원을 사용하여 여러 경로에 대한 액세스를 보호하려고합니다. 나는 그렇게하려면 다음 경로를 사용하고 있습니다 : 여기 CanActivate와 CanActivateChild의 차이점을 이해하려고 시도합니다.
const adminRoutes : Routes = [
{
path: 'admin',
component: AdminComponent,
canActivate: [ AuthGuardService ],
children : [
{
path: '',
canActivateChild: [ AuthGuardService ],
children: [
{ path: 'edit', component: DashboardComponent},
{ path: '', component: DashboardComponent}
]
}
]
}
];
내가 '/ 관리'와 '/ 관리/편집'에 액세스하려고하면
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
}
}
처럼
AuthGuardService
가 어떻게 생겼는지 살펴입니다
canActivate
콘솔 만 표시 나는
canActivate
를 제거하고 콘솔 표시를
canActivateChild
을 다시 가져
Guarding...
을 (
canActivateChild
는 주석)과 ys
Guarding children...
둘 다 유지하면 Guarding...
으로 돌아갑니다. canActivate
이 루트 요소와 하위 요소를 모두 보호 할 때 canActivateChild
의 목적은 무엇입니까?
추신 : 자식 경로가 활성화되기 전에 canActivateChild
이 실행됩니다. 그러나 그 이점은 무엇입니까? 그 중 하나만 유지하는 것이 충분하지 않습니까?
CanActivateChild 대신 canActivate를 사용할 수 없습니까? – YounesM
어쩌면, 귀하의 요구 사항에 따라 달라질 수 있습니다. 위에 주어진 예는 너무 고심 한 것일 수 있습니다. 'canActivateChild'는 각 자식 경로가 활성화되기 전에 실행됩니다. 실제로'canActivate'를 사용하여 모든 하위 구성 요소를 루트 구성 요소로 보호 할 수 있지만 루트 구성 요소를 볼 수 있어야 할 때 특정 사용자에게 표시 할 필요가없는 자식이있을 수 있습니다. 예를 들어 대부분의 사용자 또는 모든 사용자가 루트에 있어야하지만 특정 루트의 하위 노드는 반드시 가져야하는 기능 모듈에 일부 관리 구성 요소를 뿌릴 수 있습니다. –