Использовать HTTP-перехватчик при условии, заданном в $rootScope

#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 .