У меня есть маршрутизатор, который называется PermissionGuard
, который здесь инициируется
const routes: Routes = [
{
path: ':company',
component: CompanyComponent,
canActivate: [PermissionGuard],
canActivateChild: [PermissionGuard],
children: [
{
path: '',
component: IndexComponent
},
{
path: 'projects',
loadChildren: '../projects/projects.module#ProjectsModule'
},
]
}
];
Внутри моего PermissionGuard
я подписываюсь на PermissionService
следующим образом:
export class PermissionGuard implements CanActivate, CanActivateChild {
private permissions: Permission[];
constructor(private permissionService: PermissionService, private router: Router) {
this.permissionService.permissions$.subscribe(
(permissions: Permission[]) => {
this.permissions = permissions;
}
);
}
canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> {
this.permissionService.getPermissions(next.paramMap.get('company'));
return this.permissionService.permissionsFetchDone$
.pipe(filter(x => x))
.pipe(
map(response => {
if (this.permissions) {
return true;
} else {
this.router.navigate(['/forbidden']);
}
})
);
}
}
ивыполнить необходимые canActivate
или canActivateChild
проверки на основе этих данных.Из добавления console.log()
и выдачи новых данных из permissions$
внутри дочерних маршрутов я вижу, что наблюдаемая все еще активна, даже если охрана «использовалась» и маршрут активирован.Затем я ожидал, что он исчезнет, когда я пойду на маршрут за пределами path: ':company'
, однако охранник не будет уничтожен.
Это подводит меня к моему вопросу: Я делаю этоправильно?Я хочу использовать охрану, чтобы проверить, есть ли у пользователя какие-либо разрешения, но в то же время я хочу выполнить HTTP-запрос на разрешения только один раз (при переходе к path: ':company'
или любому из его дочерних элементов).Боюсь, что если я буду использовать такие охранники, это со временем замедлит все приложение из-за огромного количества наблюдателей.