Подтвердить что ты не робот

Ввод $http в angular factory ($ exceptionHandler) приводит к циклической зависимости

Когда я пытаюсь вставить $http в переопределенный factory, я получаю ошибку:

Неподготовленная ошибка: [$ injector: cdep] Найдена круговая зависимость: $http < - $exceptionHandler < - $rootScope

AngularModule.factory('$exceptionHandler',  function ($http) {

какие идеи решить? если я использую [], $http undefined

edit_ _________________

в соответствии с нижеприведенным ответом:

MyModule.config(function($provide, $http) {
    $provide.decorator("$exceptionHandler", function($delegate) {
        return function(exception, cause) {..

но я все еще получаю круговую ошибку:

Неподготовленная ошибка: [$ injector: cdep] Найдена круговая зависимость: $http < - $exceptionHandler < - $rootScope

4b9b3361

Ответ 1

Внесите $injector, а затем получите услугу $http. Что-то вроде этого:

AngularModule.factory('$exceptionHandler',  function ($injector) {
    var $http = $injector.get("$http");

См. https://groups.google.com/forum/#!topic/angular/lbFY_14ZtnU/discussion

Однако это полностью переопределит функциональность $exceptionHandler, предоставляемую Angular. Если вы просто хотите добавить серверный журнал к существующей функциональности, см. этот вопрос о расширении функциональности $exceptionHandler.

Ответ 2

Я использую это решение из-за проблем с круговой зависимостью с rootScope:

angular
  .module('facilityLog')
  .provider('$exceptionHandler', function() {
 "use strict";

 this.$get = function($injector) {

  function exceptionHandler(exception, cause) {
   // This is the part where you get the instance of $http in your case
   var $rootScope = $injector.get('$rootScope');
   //...
  }

  return exceptionHandler;

}});

Итак, если вы запрашиваете экземпляр внутри функции exceptionHandler, вы не получите ошибку зависимости от цикла.

Ответ 3

Для этого я использовал следующее. Обратите внимание на то, как нотация массива используется для обеспечения безопасности этого минимума. Также обратите внимание, что я полностью переопределяю $esceptionHandler и использую свой собственный сервис, чтобы заменить его.

angular
    .module('app')
    .factory('$exceptionHandler', $exceptionHandler);

$exceptionHandler.$inject = ['$injector', 'exceptionLoggingService'];

function $exceptionHandler($injector, exceptionLoggingService)
{
    return function(exception, cause)
    {
        exceptionLoggingService.http = exceptionLoggingService.http || $injector.get('$http');
        exceptionLoggingService.error(exception, cause);
    };
}