Перехватчики ресурсов AngularJS $
Как добавить перехватчики к вызову $resource
?
Скажем, у меня есть ресурс factory, называемый 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
Чтобы использовать перехватчик в ресурсе, вы должны:
1 - Сделать httpInterceptor с запросом, ответом, responseError:
app.factory('myInterceptor', function () {
//Code
//return { request:...,
});
2 - настройте этот перехватчик в своем приложении:
app.config(['$httpProvider', function ($httpProvider) {
$httpProvider.interceptors.push('myInterceptor');
}]);
Прямо сейчас, когда у вас есть конфиг, у вашего httpProvider есть перехватчик, куда бы вы ни вводили $http, вы будете использовать этого провайдера, так что... вы исключите ваш запрос, ответ и функцию ответа на вызов.
3 - Использование его в ресурсе.
Поскольку $resource использует $http, и у вас есть настройка httpProvider globaly, вы будете называть функцию перехватчиков при использовании своего ресурса.
Второй вопрос:
Вы не можете установить перехватчик для конкретного объекта $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...
}
});
Ответ 2
Из документов:
Объект перехватчика имеет два необязательных метода - response и responseError
Я не знаю, чего вы хотите достичь, но альтернативными могут быть общие HTTP-перехватчики.
Ответ 3
Общий HTTP-перехватчик должен делать то, что вы хотите. Вы можете найти здесь образец: Обработать ответ HTTP 302 от прокси-сервера в angularjs.