問題タブ [angular-router-guards]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
angular - 間違ったルート ナビゲーション動作を引き起こすルート ガード
別のルートをナビゲートしようとすると問題が発生します。
2 つの異なるルート モジュールがあります。
app.routes.ts :
のみを含むLoginPage
:
PreventLoggedInAccess.canActivateを使用/app
すると、ユーザーが既にログインしている場合、プレフィックスと子ルートを使用してログイン セクションにリダイレクトされますhome
。次のように定義されています。
pages.routes.ts :
/app
ユーザーがログインしている場合にのみアクセスできるすべてのサブルートを含みます。これは次を使用して実現されAuthGuardService.canActivateChild
ます。
/login
ユーザーがログインしていない場合にリダイレクトする後者を使用します。次のように定義されます。
app/home
からにナビゲートすると、2回ナビゲートapp/contents
した後にのみに移動します。ContentsComponent
したがって、2 回実行this._router.navigate(['app/components']);
すると機能し、1 回だけ実行すると、ルートが からapp/home
に1app/route
ミリ秒の間変更されて に戻りますがapp/home
、2 回実行するとルートが変更されます。一方、私が入っapp/contents
てナビゲートしようとすると、app/home
ルートがうまく変わります。
isAuthenticated
正常に動作します。どちらの authguards も問題なく動作するため、app
ログインしていないときに子ルートにアクセスしようとすると、ログインにリダイレクトされ、ログインしてlogin
いるときにアクセスしようとすると、にリダイレクトされapp/home
ます。
少しデバッグすることができたので、次のフローに気付きました。
- 最初の試行 -
app/home
->app/contents
:navigate(['app/contents'])
と呼ばれるPreventLoggedInAccess.canActivate
と呼ばれるAuthGuardService.canActivateChild
と呼ばれる
- 2 回目の試行 -
app/home
->app/contents
:navigate(['app/contents'])
と呼ばれるAuthGuardService.canActivateChild
と呼ばれる
もちろん、予想される動作は 2 番目のものです。
編集
this._router.navigate([/app/home]);
から削除PreventLoggedInAccess.canActivate
すると問題が解決します
しかし、それでも、子供に接続されているにもかかわらず、子供に移動するときに呼び出される理由がわかりませんか? 最初の試行でのみ呼び出されるのはなぜですか?PreventLoggedInAccess.canActivate
app
AuthGuardService.canActivateChild
angular - Guard の this.router.navigate は、将来のルートをブロックします
Angular 4 で 2 つのガードを設定しました。保護されたルートに到達しようとしたときにユーザーをログイン ページにリダイレクトするガードと、まだ行っていない場合は「ホーム」からウェルカム ページにリダイレクトするガードです。
警備員自体は美しく機能します...しかし、非常に奇妙な動作に気付きました. this.router.navigate
WelcomeTraveler ガードにリダイレクトを追加すると、ログインした後でも、最初のガードから保護されたルートにアクセスできない状態になります。ホームページに送り返され続けます。
これが私の警備員です:
ルーティング テーブルのスニペットを次に示します。
ガード内に が存在すること自体が問題を引き起こしているようthis.router.navigate
です。WelcomeTraveler
ログインすると、プロファイルへのルーティングを試みた直後 (最初のガードを正常に通過した後) に「ホーム」に戻されます。ナビゲート行を削除すると、問題は解決します。
何か案は?