我有以下路线:
{
path: 'teacher',
component: DashboardTeacher, canActivate: [AccessGuardTeacher('Teacher')]
}
正如你所看到的,我尝试在类中传递参数“老师”
AccessGuardTeacher
:
export class AccessGuardTeacher implements CanActivate {
constructor(private role: string) {
}
}
怎样做才是正确的?
您的路线应配置为:
{
path: 'teacher',
component: DashboardTeacherComponent,
canActivate: [AccessGuardTeacher],
data: {
role: 'teacher'
}
}
在 CanActivate Guard 中获取路线数据
export class AccessGuardTeacher implements CanActivate {
constructor() {
}
canActivate(route: ActivatedRouteSnapshot): boolean {
const role = route.data.role;
return true; //based on your condition
}
}
try this way:
{
path: 'teacher',
component: DashboardTeacher, canActivate: [AccessGuardTeacher],
data: {type: ['Teacher']}
}
export class AccessGuardTeacher implements CanActivate {
constructor(private role: string) {
}
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
let type = route.data["type"] as Array<string>;
}
}
Angular 14+ 解决方案
{
path: 'edit',
component: Cmp,
canActivate: [
() =>
inject(Service).hasUserPermissions(['WRITE_SOMETHING'])
? true
: inject(Router).parseUrl('/goSomewhere'),
],
},
Anuglar 16+ 解决方案(CanActivateFn)
{
path: 'myModule',
loadChildren: (): any => import('./view/myModule/myModule.module').then(m => m.MyModule),
canActivate: [RolesAllowedGuard],
data: {
rolesAllowed: [
OrgRoleEnum._7Lmva,
OrgRoleEnum._6Lmvs,
OrgRoleEnum._5Sa,
OrgRoleEnum._4A,
OrgRoleEnum.SuperuserIdp,
OrgRoleEnum._3Su,
OrgRoleEnum._2Lp]
}
}
export const RolesAllowedGuard: CanActivateFn = (guardRolesAllowed) => {
const userState: UserState = inject(UserState);
const router: Router = inject(Router);
return userState.orgRole$.pipe(
filter(role => role !== OrgRoleEnum.NotSet),
map((role) => {
const rolesAllowed = guardRolesAllowed.data["rolesAllowed"];
if (rolesAllowed && rolesAllowed.includes(role)) {
return true;
}
return router.createUrlTree(['/startpage'])
})
);
};