0

Angular アプリで多かれ少なかれ一般的なエラー ハンドラーを作成したいと考えています。

たとえば、次のリンクを含むメールを受け取ります: mysite/messages/151 このメールをクリックすると: ログインしていない場合、フレームワークは 403 を (意図的に) 返します。

だから私はこの工場を作りました。今のところ、403 エラーを探してから、ユーザーをログイン ページにルーティングするだけです。

app.factory('httpRequestInterceptor', ['$q', '$location', '$rootScope', function($q, $location) {

    return {
        'responseError': function(rejection) {
            if (rejection.status === 403) {

                $location.path('/user/login');
                return $q.reject(rejection);
            }
        }
    };
}]);

app.config で、次の行を追加しました。

app.config(['$httpProvider', function($httpProvider)
{

    $httpProvider.interceptors.push('httpRequestInterceptor');

403 が表示されたら、正しいパスに移動します: /user/login これまでのところ、問題ありません。

しかし...どうにかして$stateを追加したいので、呼び出し元のURLが(messages/151)であることがわかっているので、正しい場所に戻ってメッセージを表示できます。

工場で $state を使用できません (まだ理解していない技術的なもの ($http と $state?) によるエラー) です。

だから、私は欲しい:

1) URL の 403 エラーでログイン状態に移行 (動作)

2) ユーザーからログイン資格情報を取得する (動作)

3) ログイン後の URL への移動は問題ありません (手がかりではありません)

別のアプローチを使用する必要があるかもしれませんが、頭を悩ませることはできません。うまくいけば、誰かが私を助けてくれますか?

4

2 に答える 2

0

ブロードキャストの方法も良いですが、以下の方法でも可能です。ルーティング要求を処理するために ui-router を使用している場合は、次を使用できます。 n 承認サービス:

// There is a positive point to use this, your router will not get loaded before authorization
// $stateChangeStart call before routing to other state

rootScope.$on("$stateChangeStart", function (event, toState, toParams, fromState, fromParams) {
    if(!session.exists()){
        // Unauthorize User
        event.preventDefault();
        state.go("error");
    }else{
        // Normal Flow
        location.path(toState.url);
    }
});
于 2014-08-12T16:08:31.817 に答える