5

私の工場は次のようになります。

'use strict';

angular.module('myApp')
  .factory('httpInterceptor',['$q','$location', '$rootScope', function($q, $location, $rootScope){
    return {
      response: function(response) {

        if(response.success === false) {
console.log("Redirecting");
            $location.path('/login');
            return $q.reject(response);
        }

        return response || $q.when(response);
      }
    }
}]);

ログを吐き出しますが、パスは変更しません。これを実現するにはどうすればよいですか?

4

4 に答える 4

10

$locationのドキュメントには次のように書かれています。

セッターは window.location をすぐには更新しないことに注意してください。代わりに、$location サービスはスコープのライフサイクルを認識し、スコープの $digest フェーズで複数の $location ミューテーションを window.location オブジェクトへの 1 つの「コミット」に結合します。

したがって、promise の拒否が に影響を与える$location場合、意図した変更が表示されない可能性があります。

angularライフサイクル外で変更を強制するには、hash使用window.locationを設定してからページのリロードを強制できます。もちろん、これにより、後続のコードの実行が停止され、セッションが消去されますが、ユーザーがログインしていない場合は、これが必要になる場合があります。

于 2013-11-02T01:36:28.630 に答える
6

angular の適用サイクル外の場合、$location がリダイレクトされない場合があります。$apply 内に $location をラップしてみてください。

$rootScope.$apply( function(){$location.path('/somelocatin'); } );
于 2013-11-02T01:55:35.637 に答える
3

これはAngular 1.3.14で私のために働いた

myServices.factory('Factory', ['$rootScope', '$location', function ($rootScope, $location) {
  // do something and redirect
  $location.path('path')
  $rootScope.$apply()
}])

$rootScope.$apply()が呼び出しの後にあることに注意してください。$location.path('path')何らかの理由で、上記のように $apply 呼び出しコールバック内にラップしても機能しませんでした。

于 2015-03-11T08:45:39.007 に答える