5

非常に単純なインターセプターを使用して、ユーザーをログインにリダイレクトするために 403 Access Forbidden の responseRejection をチェックしていますが、リダイレクトされません。$location.path の前とその後の行まで console.log を実行できますが、それは発生しません。他の誰かがこれを起こしたことがありますか?私はこれを少し見つめてきました...もともと私は $location を使用したくありませんでしたが、循環依存関係を取得せずに ui.router を注入することはできません。私がそれについて考えている間、 $location は私を動かし続けるはずだったので、取り除くために。

.factory('AuthInterceptor', ['$q', '$location',
    function( $q, $location ) {

    var service = {
        responseError: function( responseRejection ) {

            // Authorization issue, access forbidden
            if( responseRejection.status === 403 ) {

                // TODO: show a login dialog, and/or redirect to login
                console.log("Response rejected. Redirecting to login...");

                $location.path('/login');
                $location.replace();

                console.log("Not so much with the redirecting... I'm still here");
            }

            // Propagate error to any chained promise handlers
            return $q.reject( responseRejection );
        }
    }

    return service;
}])
4

1 に答える 1

2

それを使用してウィンドウの場所を設定するlocation.hrefと、場所がすぐに設定され、スクリプトの実行が停止しますが、場所の変更は、実行中の現在のスクリプト パスが完了した場合にのみ有効になります。そのため、href の下のステートメントが実行されます。これもブロック アクティビティではありません (アラートやプロンプトとは異なります)。angular ラッパーを使用して場所を設定すると、ダイジェスト サイクルの後に有効になります。$stateまた、$httpインターセプターに注入するときに、循環依存の有効な問題があります。$stateそれを克服するには、を使用してのインスタンスを取得できます$injector.

.factory('AuthInterceptor', ['$q', '$injector',
    function( $q, $injector ) {

    var $state;

    var service = {
        responseError: function( responseRejection ) {

            // Authorization issue, access forbidden
            if( responseRejection.status === 403 ) {

                // TODO: show a login dialog, and/or redirect to login
                console.log("Response rejected. Redirecting to login...");

                _setState('login');

                console.log("Not so much with the redirecting... I'm still here");
            }

            // Propagate error to any chained promise handlers
            return $q.reject( responseRejection );
        }
    }
   function _setState(stateName){
        if(!$state) {
          $injector.get('$state'); //Or just get $state from $injector always it is anyways the dependency container and service are singletons
        }
       $state.go(stateName);
    }
    return service;
}]);
于 2014-10-27T20:25:33.130 に答える