您的问题中有趣的是公式:
有没有办法说,“只有在canActivate 类评估为 false时才继续这条路线
”?
以及您如何表达“直观”的解决方案:
{ path: 'log-in', component: LoginComponent, canActivate: [ !UserLoggedInGuard ] },
这基本上说,你需要negate
的结果UserLoggedInGuard@canActivate
让我们考虑以下实现UserLoggedInGuard
:
@Injectable()
export class UserLoggedInGuard implements CanActivate {
constructor(private _authService: AuthService) {}
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
return this._authService.isLoggedIn();
}
}
接下来,让我们看看@Mike 提出的解决方案
@Injectable()
export class NegateUserLoggedInGuard implements CanActivate {
constructor(private _authService: AuthService) {}
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
return !this._authService.isLoggedIn();
}
}
现在,该方法还可以,但与UserLoggedInGuard
. 如果由于某种原因执行UserLoggedInGuard@canActivate
更改,NegateUserLoggedInGuard
将会中断。
我们怎样才能避免呢?简单,滥用依赖注入:
@Injectable()
export class NegateUserLoggedInGuard implements CanActivate {
constructor(private _userLoggedInGuard: UserLoggedInGuard) {}
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
return !this._userLoggedInGuard.canActivate(route,state);
}
}
现在这正是你所表达的
canActivate: [ !UserLoggedInGuard ]
最好的部分:
- 它没有与内部实现紧密耦合
UserLoggedInGuard
- 可以扩展来操作多个
Guard
类的结果