【发布时间】:2019-03-26 22:23:02
【问题描述】:
我有一个名为 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$ 发出新数据,我可以看到observable 仍然处于活动状态,即使已经“使用”了警卫并且激活了路由。当我去path: ':company'以外的路线时,我期待它会消失,但是守卫没有被摧毁。
这让我想到了我的问题:
我这样做正确吗?我希望使用警卫来检查用户是否有任何权限,但同时我只想执行一次 HTTP 权限请求(导航到 path: ':company' 或其任何子级时)。恐怕如果我使用这样的守卫,由于大量的观察者,它会及时减慢整个应用程序的速度。
【问题讨论】:
标签: angular rxjs6 angular-observable angular-guards