3

我的一条私人路线上有一个路线守卫,当守卫返回 false 时,它​​不再被调用。以下示例简化了如何重现这种情况。

当用户使用链接导航时:

<a [routerLink]="['my-private-route']">Link</a>

守卫被调用,我called在控制台中看到消息并且导航被取消(我返回false守卫):

@Injectable()
export class CanActivateViaAuthGuard implements CanActivate {
  canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean>|Promise<boolean>|boolean {
    console.log('called')
    return false;
  }
}

但是,当用户再次单击该链接时,什么也没有发生。

为什么我需要这样的行为?我需要重复调​​用 guard 的原因是因为我必须显示 modal Do you want to login? YES/NO。当用户点击no我想留在页面上。但是当他后来决定再次导航时,我想让他再次登录。

有什么方法可以停止 angular2 缓存保护结果?

4

2 回答 2

4

经过@GünterZöchbauer的一些调查和帮助,这是角度路由器3.2.0的一种奇怪行为。已经有类似的问题:https ://github.com/angular/angular/issues/12851

Here is plunker with 3.1.2 where guard is evaluated every time:

https://plnkr.co/edit/jUhVJY?p=preview

Here is plunker with 3.2.0 where guard is evaluated only once:

https://plnkr.co/edit/2A0Wfu?p=preview

于 2016-11-19T12:51:16.820 回答
2

我遇到了同样的问题。看起来该行为可以在 4.x 中被覆盖:

https://angular.io/api/router/Routes

检查runGuardsAndResolvers路由参数。

我还错误地假设在路由器 3.4.x 中将使用值“始终”

于 2017-05-07T15:19:58.010 回答