Несколько маршрутов / панель инструментов для разных ролей с AuthGuard

Я хочу, чтобы на моей домашней странице загружались разные модули для разных ролей

const routes: Routes = [
      {
        path: 'login',
        component: LoginComponent,
      },
      { path: '', loadChildren: './dashboard/dashboard.module#DashboardModule', canLoad: [AuthGuard], canActivate: [AuthGuard], },
      {
        path: '',
        loadChildren: './dashboard/dashboard.module#DashboardModule',
        canActivate: [true]
      },
]

AuthGuard здесь

canActivate(
    next: ActivatedRouteSnapshot,
    state: RouterStateSnapshot
  ): Observable<boolean> | Promise<boolean> | boolean {
    if (localStorage.getItem('ISTRAINER') === Role.Trainer
    && next.routeConfig.loadChildren === './dashboard/dashboard.module#DashboardModule') {
      return true;
    }
    return false;
  }
  canLoad(route: Route): boolean {
    return false;
  }

когда canLoad: [AuthGuard] возвращает false, маршрутизатор не проверяет следующий маршрут

или есть способ изменить loadChildren в зависимости от маршрута

на самом деле я хочу добиться того, чтобы при входе в систему, скажем, на маршруте «Панель мониторинга» или на «» загружается модуль «Студент», если роль студента входит в систему на маршруте «Панель управления» или загружается модуль преподавателя, если роль преподавателя выполняется на маршруте «Панель управления» или on "" Модуль администратора загружается, если роль администратора вошла в систему


person Mubeen    schedule 05.03.2019    source источник
comment
вы можете перейти к своему пути из машинописного текста в зависимости от условия внутри функции canActivate.   -  person emkay    schedule 05.03.2019
comment
добавлено еще несколько объяснений, любезно просмотрите это тоже   -  person Mubeen    schedule 05.03.2019
comment
Значит, у вас будет 3 компонента приборной панели в модуле приборной панели? Как и для студента, у вас есть панель управления студентом, админ - ›панель администратора, учитель -› панель учителя. И что бы ни было в localStorage, вы будете перенаправлять на эту конкретную панель управления? Это вариант использования?   -  person emkay    schedule 05.03.2019


Ответы (2)


вы можете использовать сопоставление URL-адресов из angular https://angular.io/api/router/UrlMatcher

import { trainerMatcher } from './trainerMatcher'
import { studentMatcher } from './studentMatcher'
{
 path : '',
 matcher : trainerMatcher,
 loadChildren : 'trainerModule',
 canLoad : [AuthGuard]
},
{
 path : '',
 matcher : studentMatcher,
 loadChildren : 'studentModule'
}

Таким образом, вы можете написать сопоставитель и проверить там подходящую роль. Если вы все же хотите убедиться, что модуль не может быть загружен, вы все же можете установить охрану.

У меня была эта проблема, и я нашел эту статью полезной: https://medium.com/@lenseg1/loading-different-angular-modules-or-components-on-routes-with-same-path-2bb9ba4b6566

person Steve    schedule 05.03.2019

это ожидаемое поведение, когда путь совпадает и angular думает, что это именно тот маршрут, который вы просили. В вашем случае кажется, что единственный возможный вариант - обновить конфигурацию маршрута при изменении роли. см. документы router.resetConfig.

person Andrei    schedule 05.03.2019