#angularjs
#angularjs
Вопрос:
Я определяю службу HTTP-перехватчика с помощью:
fooModule.service('myHttpInterceptor', function ($q, $rootScope) {
// ...
})
Я могу вставить его в $ httpProvider в config
блоке, и перехватчик работает и всегда включен:
.config(['$httpProvider', function($httpProvider) {
$httpProvider.interceptors.push('myHttpInterceptor');
}]);
Но я не могу включить перехватчик на основе конфигурации, загруженной в $rootScope
:
.config(['$httpProvider', function($httpProvider, $rootScope) {
// $rootScope is undefined.
Если я использую .run
вместо .config
, я не смогу использовать $httpProvider
.
Как я могу использовать перехватчик HTTP, только если установлена переменная, найденная в $rootScope?
Ответ №1:
Как я могу использовать HTTP-перехватчик, только если установлена переменная, найденная в $rootScope?
Чтобы избежать загрязнения $rootScope, добавьте свойство на фабрику перехватчиков:
Напишите перехватчик для проверки myInterceptEnable
свойства перед продолжением:
app.factory('myHttpInterceptor', function() {
return {
'myInterceptEnable': false,
// optional method
'request': function(config) {
if (!this.myInterceptEnable) return config;
// do something on success
return config;
},
// optional method
'requestError': function(rejection) {
if (!this.myInterceptEnable) throw rejection;
// do something on error
if (canRecover(rejection)) {
return responseOrNewPromise
}
return throw rejection;
},
// optional method
'response': function(response) {
if (!this.myInterceptEnable) return response;
// do something on success
return response;
},
// optional method
'responseError': function(rejection) {
if (!this.myInterceptEnable) throw rejection;
// do something on error
if (canRecover(rejection)) {
return responseOrNewPromise
}
return throw rejection;
}
};
});
Затем перехватчик можно включить или выключить, установив myHttpInterceptor.myInterceptEnable
либо true
, либо false
.
app.run(function(myInterceptor) {
myInterceptor.myInterceptEnable = true;
});
Ответ №2:
Вы не можете — вы можете вводить провайдеров только в функции конфигурации, потому что они запускаются до создания зависимостей.
Но вместо этого вы можете изменить свой myHttpInterceptor
, чтобы проверить свойство в корневой области, прежде чем выполнять какую-либо из его пользовательских логик перехватчика. Таким образом, перехватчик просто ничего не будет делать, когда свойство не установлено.
Комментарии:
1. Спасибо @GregL Я подумал, что это будет правильный путь, я просто надеялся, что смогу сохранить перехватчик как можно более модульным.
2. Его зависимость от
$rootScope
свойства не является особенно модульной.$rootScope
почти так же плохо, как глобальная область. Но я рад, что помог вам подтвердить единственное реальное решение.3. Чтобы уточнить, я имел в виду модульный, поскольку он может применяться к клиенту, но не к другому (которые оба используют одну и ту же кодовую базу). Конфигурации клиента — это то, что загружено в $rootScope и от чего зависит перехватчик @GregL .