問題タブ [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.

0 投票する
1 に答える
996 参照

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.canActivateappAuthGuardService.canActivateChild

0 投票する
1 に答える
1545 参照

angular - Guard の this.router.navigate は、将来のルートをブロックします

Angular 4 で 2 つのガードを設定しました。保護されたルートに到達しようとしたときにユーザーをログイン ページにリダイレクトするガードと、まだ行っていない場合は「ホーム」からウェルカム ページにリダイレクトするガードです。

警備員自体は美しく機能します...しかし、非常に奇妙な動作に気付きました. this.router.navigateWelcomeTraveler ガードにリダイレクトを追加すると、ログインした後でも、最初のガードから保護されたルートにアクセスできない状態になります。ホームページに送り返され続けます。

これが私の警備員です:

ルーティング テーブルのスニペットを次に示します。

ガード内に が存在すること自体が問題を引き起こしているようthis.router.navigateです。WelcomeTravelerログインすると、プロファイルへのルーティングを試みた直後 (最初のガードを正常に通過した後) に「ホーム」に戻されます。ナビゲート行を削除すると、問題は解決します。

何か案は?