3

angular 開発者のほとんどが知っているように、Resolveプロパティを使用すると、特定のページへのアクセスを保護できます。

スニペット コードの簡単な例を次に示します。

.config(['$routeProvider', 'securityAuthorizationProvider',
                function ($routeProvider, securityAuthorizationProvider) {
                      $routeProvider.when('/test', {
                          templateUrl: '/myCorrespondingView.tpl.html',
                          controller: 'MyCorrespondingCtrl',
                          resolve: securityAuthorizationProvider.requireAuthenticatedUser
                      });
                }])

「保護されたページにアクセスするには、ここをクリックしてください」というリンクを含むページを考えてみましょう($location.path("/test")ボンネットの下に作成)。

期待は次のとおりです。クリックすると、存在するresolveようにrejectedなり、...呼び出し元のページ以外のページにリダイレクトされません。

これにより、何も発生しません (ユーザーがページにアクセスできないという単純な事実で十分です) が、URL が対象の保護されたページに変更されました。=> myApp.com/test (なぜAngularは約束の結果が成功した場合にのみこの置換を行わないのですか?? :(、しかし、これは私が今尋ねた別の質問です: AngularJS /対応するテンプレートの解決プロパティが解決された場合にのみURLを変更する) .

その後...もう一度クリック...

resolve残骸は一切再処理されていないようです。

次に...アプリケーションの他のリンクをクリックして(もちろん完全なリダイレクトなしで)、URLを変更するために必要な方を選択し、保護されたリンクを再クリックします=>Resolve再度適切に処理されます。

現在のページの URL と必要なページの URL をチェックし、resolve両方が同じ場合にタスクの再処理を回避する Angular メカニズムはありますか?

resolveURLがすでにターゲットページに対応している場合でも、プロセスを強制したい.

**更新******** この投稿から: https://stackoverflow.com/a/12429133/985949

Angular は場所の変更を監視します (場所バーに入力するか、リンクをクリックするか、$location.path() を介して場所を設定することによって達成されます)。この変化を感知すると、イベント「$locationChangeSuccess」を $broadcast し、ルーティング プロセスを開始します。

上で想定したチェックは確かに$location.path方法で行われているようですね...評価を強制できれば素晴らしいと思います。

4

2 に答える 2

3

Angular ルートは、クリックではなく、URL の変更に応答します。ブラウザのAngularで場所が変わらない場合、場所はまったく取得されません。

「$locationChangeSuccess」をリッスンし、最後に成功したルートを追跡するサービスを作成する必要があるようです。次に、失敗時に場所を最後に成功したルートにリセットする $routeChangeError に別のリスナーを用意します。これにより、ロケーションが現在アクティブなルートと一致しないという一貫性のない状態に留まることを防ぐことができます。

これを行うと、リンクをもう一度クリックすると、ブラウザが場所を再度変更しようとするため、解決が再びトリガーされます。

于 2013-10-30T00:41:13.313 に答える