如何向canActivate的构造函数传递参数?

问题描述 投票:0回答:4

我有以下路线:

{
    path: 'teacher',
    component: DashboardTeacher, canActivate: [AccessGuardTeacher('Teacher')]
}

正如你所看到的,我尝试在类中传递参数“老师”

AccessGuardTeacher

export class AccessGuardTeacher implements CanActivate {

  constructor(private role: string) {
  }
}

怎样做才是正确的?

angular angular5
4个回答
25
投票

您的路线应配置为:

{ 
   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
    }
}

3
投票
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>;

  }
}

1
投票

Angular 14+ 解决方案

{
    path: 'edit',
    component: Cmp,
    canActivate: [
      () =>
        inject(Service).hasUserPermissions(['WRITE_SOMETHING'])
          ? true
          : inject(Router).parseUrl('/goSomewhere'),
    ],
  },

0
投票

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'])
    })
  );

};

© www.soinside.com 2019 - 2024. All rights reserved.