0

アップデート

自分で解決したと思います。以下のソリューションとして投稿したインターセプターを確認してください。

オリジナル

リクエストがどのように行われているかを発信者に知らせることができる http インターセプターを書くことができるかどうか疑問に思っていました。

今、バックエンドを呼び出したいときは、渡すオブジェクトに属性を設定するラッパーで $http 呼び出しをラップします。

publ.wrap = function(f, ctrl){

    ctrl.busy   = true;
    ctrl.error  = false;

    return f()

    .then(function(res){

        ctrl.busy   = false;
        ctrl.result = res;

        return res;

    }).catch(function(err){

        ctrl.busy   = false;
        ctrl.error  = err;
        ctrl.result = undefined;

    })

};



publ.login    = function(args, ctrl){

    publ.wrap(function(){

        return $http.post('http://localhost:3001/authenticate', {
            username : args.username,
            password : args.password
        }).then(function(jwt){

            $cookies.put('token', jwt);
        })
    }, ctrl);
};

この場合、login(authArgs, $scope.loginCtrl)ログイン ページ コントローラーを呼び出します。次に、ログイン テンプレートでloginCtrl.busy, loginCtrl.result&を使用します。loginCtrl.error

バックエンドに対して行うすべての呼び出しで、これらの属性を設定し、リクエストを開始するビューで使用できるようにしたいと考えています。

このようなラッパー関数を使用すると仕事が完了しますが、インターセプターを使用して実行できるかどうか疑問に思っていますか? これにより、すべてのバックエンド呼び出しをサービスで明示的にラップする必要のない、よりクリーンな要求フローが提供されるように感じます。

今、私はhttpInterceptorsを読んで、ユーザー提供のオブジェクトに属性を設定させる方法を見つけることができないようです. 私が見つけた最後のものは、例(タイムスタンプマーカー(リクエストおよび応答インターセプター))を含むこの記事requestで、インターセプターステージとresponseインターセプターステージの両方で構成オブジェクトに属性を追加します。responseErrorステージまたは発信者コントローラーで。

どんな助けでも大歓迎です:)

4

2 に答える 2

0

Angular イベントを使用して、次のような処理を行います。たとえば、次のようになります。

    .controller('parentCtrl', function($scope,$rootScope) {
        $rootScope.$on('loading',function(e,_statusObj.loading) {
            $scope.loading = _statusObj.loading;
            if(!!_statusObj.msg) {
                alert(_statusObj.msg);
            }
        });
    })
    .controller('childCtrl', function($scope,$http) {
        $scope.myAjaxCall = function(_url,_data) {
            $scope.$emit('loading',{ loading: true});
            $http.post(_url,_data).success(function(_response) {
                $scope.$emit('loading',{ loading: false });
            })
            .error(function(_error) {
                $scope.$emit('loading',{
                    loading : false,
                    msg     : _error.message
                });
            });
        }
    });
于 2015-11-02T17:18:24.087 に答える
0

なんとかインターセプターを機能させることができました。どうやら、すべてのインターセプター フェーズで構成ファイルにアクセスできるようです。

/******************************************
    SETUP BUSY/ERROR/DATA HTTP INTERCEPTOR
*******************************************/
.config(function($httpProvider){

    $httpProvider.interceptors.push(function($q) {
      return {

        request  : function(config) {

            if(config.ctrl){
                config.ctrl.busy   = true;
                config.ctrl.error  = false;
                config.ctrl.data   = undefined;
            }

            return config;
        },
        response : function(response) {

            if(response.config && response.config.ctrl){
                response.config.ctrl.busy = false;
                response.config.ctrl.data = response.data;
            }

            return response;
        },

        responseError : function(response){

            // note: maybe use a different error message for different kinds of responses?
            var error = response.status + " "+response.statusText+" - "+response.data;

            if(response.config && response.config.ctrl){
                response.config.ctrl.busy = false;
                response.config.ctrl.error = error;
            }

            return $q.reject(error);
        }
      };
    });

})
于 2015-11-03T08:20:37.680 に答える