$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
呼び出しにインターセプターを割り当てる方法もあります。 ?
リソースでインターセプターを使用するには、次のことを行う必要があります。
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...
}
});
ドキュメントから:
インターセプターオブジェクトには、responseとresponseErrorの2つのオプションのメソッドがあります
何を達成したいのかわかりませんが、汎用HTTPインターセプターが代替手段になる可能性があります。
汎用HTTPインターセプターはあなたが望むことをするはずです。ここにサンプルがあります: angularjsのプロキシからのHTTP 302応答を処理します 。