2016-11-19 30 views
2

自分のプライベートルートの1つにルートガードがあります。ガードがfalseを返すと、もうもうコールされません。次の例は、このような状況を再現する方法を簡略化したものです。angular2ルートガードを複数回呼び出す

ユーザーがリンクを使用してナビゲートする場合:

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

ガードが呼び出されると、私は(私はガードでfalseを返す)コンソールとナビゲーションでcalledメッセージがキャンセルされて参照してください。

@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違いは、角度2.2.0対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

@Anthonyはい。次のパッチバージョンで修正されています。 –

1

。動作は4.xで上書きすることができるように見えます:runGuardsAndResolversルートパラメータの

https://angular.io/docs/ts/latest/api/router/index/Routes-type-alias.html

チェックを。

私は間違って値を "常に"ルータ3.4.xで使用されると仮定しました

+0

これはどのように実装しますか? "runGuardsAndResolvers: 'always'、"は何もしていないようです。 canDeactivateガードはまだ一度だけ呼び出されます。 – Anthony

関連する問題