2016-11-19 65 views
2

我在我的私人路线之一有一个路线警卫,当警卫返回假时,它不再被调用。下面的例子简化了如何重现这种情况。多次呼叫angular2路线警卫

当用户浏览使用链接:

<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; 
    } 
} 

然而,当用户再次点击链接时,什么也没有发生。

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

有没有什么办法可以阻止angular2缓存后卫结果?

+0

使用的值请提供Plunker重现。我希望这也能工作。 –

+1

@GünterZöchbauer有趣。我做了那个笨蛋,确实在那里工作。 https://plnkr.co/edit/17CBn14zPuyrAhVnS4pA我将研究我的代码如何不同。谢谢你:-) –

+0

@GünterZöchbauer的区别是Angular 2.2.0 vs 2.1.2。看起来这个守卫缓存出现在2.2.0中。 –

回答

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

+0

这是固定在角4吗? – Anthony

+0

@安东尼是的。它已在下一个修补程序版本中修复。 –