web-dev-qa-db-ja.com

AngularJS $ resourceインターセプター

$resource呼び出しにインターセプターを追加するにはどうすればよいですか?

たとえば、Usersというリソースファクトリがあるとします。

app.factory('Users', ['$resource', 'resourceInterceptor',
  function ($resource, resourceInterceptor) {
    return $resource(
      'users/:user_id',
      {
        user_id: '@id'
      },
      {
        query: {
          method: 'GET', // Not changing the default method, just adding an interceptor
          interceptor: resourceInterceptor // Is there any better way to do this.. like globally?
        },
        save: {
          method: 'POST', // Same here
          interceptor: resourceInterceptor // Again...
        },
        ..., // And so on
      }
    );
  }]);

私のresourceInterceptorサービスは次のようになります。

app.factory('resourceInterceptor', ['$rootScope',
  function ($rootScope) {
    return {
      request: function () {
        // This function isn't executed at all?
        $rootScope.loading = true;
      },
      response: function () {
        $rootScope.loading = false;
      },
      responseError: function () {
        $rootScope.loading = false;
      }
    };
  }]);

まず第一に、requestインターセプト関数は決して実行されません、なぜですか?

次に、インターセプターを既存の$resourceメソッドにハードコーディングするのは非常に面倒です。特定の$resource呼び出しにインターセプターを簡単に割り当てる方法はありますか、あるいはすべての$resource呼び出しにインターセプターを割り当てる方法もあります。 ?

15
Unidan

リソースでインターセプターを使用するには、次のことを行う必要があります。

1-リクエスト、レスポンス、レスポンスエラーでhttpInterceptorを作成します:

app.factory('myInterceptor', function () {
    //Code
    //return { request:...,
});

2-アプリでこのインターセプターを構成します。

app.config(['$httpProvider', function ($httpProvider) {
    $httpProvider.interceptors.Push('myInterceptor');
}]);

今のところ、$ httpを挿入する場所にインターセプターを持つようにhttpProviderを構成しているので、このプロバイダーを使用するので...要求、応答、およびresponseError関数を実行します。

3-リソースで使用します。 $ resourceは$ httpを使用し、httpProviderをグローバルに構成しているので、リソースを使用するときにインターセプターの関数を呼び出します。

2番目の質問:インターセプターを具体的な$ httpオブジェクトに設定することはできません。それら(インターセプター)はグローバルに設定されます。

(モジュール定義の前にインターセプターを設定してから削除しても、実行順序はわかりません)

各$ resourceアクションでインターセプタープロパティをオーバーライドしたくない場合(質問に書き込んでいるとき)にできることは、インターセプターを改善することです。

app.factory('userLoadingInterceptor', function () {
    //Code
    return {
        request: function(){
            //Check if your are working with a url related with users
            // and if so do things...
        }
});
15
JDL

ドキュメントから:

インターセプターオブジェクトには、responseとresponseErrorの2つのオプションのメソッドがあります

何を達成したいのかわかりませんが、汎用HTTPインターセプターが代替手段になる可能性があります。

0
a better oliver

汎用HTTPインターセプターはあなたが望むことをするはずです。ここにサンプルがあります: angularjsのプロキシからのHTTP 302応答を処理します

0
MBielski