可以在数组中定义Angular 2路由器防护。例如:
sampsize
以下是我的问题:
答案 0 :(得分:7)
两名警卫的执行顺序是什么。
它们将同步运行而无需相互等待。
如果我想仅在CanAlwaysActivateGuard返回时执行AuthGuard 是的,这是可能的。
不,目前的实施是不可能的。作为一种解决方法,您可以创建一个包装警卫来按顺序运行您的警卫。
答案 1 :(得分:4)
我遇到了这个问题,并在寻找答案时碰到了您的帖子。一无所获-今天有空-我想出了一个我认为您可能会感兴趣的解决方案。我创建了一个“ CompositeRouteGuard”:
import { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot } from '@angular/router';
import {Injectable, Injector} from '@angular/core';
import { Observable } from "rxjs";
@Injectable()
export class CompositeRouteGuard implements CanActivate {
constructor( protected router: Router,
protected injector: Injector ) {
}
canActivate( route: ActivatedRouteSnapshot, state: RouterStateSnapshot ): Observable<boolean> {
var compositeCanActivateObservable: Observable<boolean> = Observable.of(true);
let routeGuards = route.data.routeGuards;
if(routeGuards){
for( var i = 0; i < routeGuards.length; i++ ){
let routeGuard = this.injector.get(routeGuards[i]);
let canActivateObservable = routeGuard.canActivate(route, state);
compositeCanActivateObservable = compositeCanActivateObservable.flatMap( (bool) => {
if(!bool){
return Observable.of(false);
}
else{
return canActivateObservable;
}
});
}
}
return compositeCanActivateObservable;
}
}
这需要在route.ts中进行一些额外的配置。您需要在路由的数据元素中添加“ routeGuards”数组。
const routes: Routes = [
{
path: '...',
component: AComponent,
data: { routeGuards: [ FooRouteGuard, BarRouteGuard, BazRouteGuard ] },
canActivate: [ CompositeRouteGuard ]
},
...
我只关心canActivate动作,但是您应该可以轻松地扩展它,例如在需要时说“ canDeactivate”。
现在,我的路由守卫以“和”语义“按顺序”运行(必须全部成功才能激活路由)。
答案 2 :(得分:1)
如果你嵌套它们,你可以决定它们的顺序:
import { Routes } from '@angular/router';
const routes: Routes = [
{
path: '',
canActivate: [CanAlwaysActivateGuard],
children: [
{
path: '',
canActivate: [AuthGuard],
children: [
// (...)
],
}
],
}
];
在任何内部路由防护之前评估外部路由防护。
答案 3 :(得分:0)
对于当前版本,您可以使用子路由器,例如:
{
path:'your-path',
canActivate:[
'CanAlwaysActivateGuard'
],
canActivateChild:[
'AuthGuard'
],
children:[
]
}
答案 4 :(得分:0)
您还可以在AuthGuard.canActivate()之前继承保护运行super.canActivate()
。
在此示例中,两个类中的
canActivate()
方法均返回Promise
。
@Injectable({
providedIn: 'root',
})
class AuthGuard extends CanAlwaysActivateGuard implements CanActivate {
constructor(/*...*/) {
super(/*...*/);
}
async canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot): Promise<boolean | UrlTree> {
const result = await super.canActivate(next, state);
if (result === true) { // Check the expected result from the parent
return await this.logicOfYourAuthGuard(); // Run your logic and return it
}
return result; // Return the original result if logic of AuthGuard is not nedded
}
}
然后,在路由中仅使用AuthGuard
。
其他选择是使用canActivateChild
,因为canActivate
防护在canActivateChild
之前运行。