2015-08-25 2 views
2

Я хочу публиковать ошибки, которые происходят внутри углового приложения.

Я следовал подходу, данному в этом related question, как это было предложено в ответе, я ввел инжектор $, а затем получил услугу $ http оттуда. Но линия

Uncaught Error: Circular dependency: $http <- $exceptionHandler <- $rootScope

Продолжается.

here is the fiddle with the problem

с соответствующим кодом:

var mod = angular.module('test', []); 
mod.config(function ($provide) { 
    $provide.decorator("$exceptionHandler", ['$delegate', '$injector',    function ($delegate, $injector) { 
     var $http = $injector.get("$http"); 
    }]); 
    }); 
mod.controller('testCtrl', function ($scope) { 
    }); 

Если вы комментируете строку

var $http = $injector.get("$http");

больше нет ошибок Круговой зависимости.

Я думаю, что у меня что-то отсутствует в моем понимании. Что я делаю не так? В конце концов, похоже, это сработало для других.

Любое предложение о том, как достичь моей первоначальной цели «отправлять ошибки в службу», также приветствуется.

Спасибо всем

ответ

3

обернуть код инжектора в функции

var mod = angular.module('test', []); 
mod.config(function ($provide) { 
    $provide.decorator("$exceptionHandler", ['$delegate', '$injector',function ($delegate, $injector) { 
      return function (exception, cause) { 
       var $http = $injector.get("$http"); 
      } 
    }]); 
    }); 

    mod.controller('testCtrl', function ($scope) { 
    }); 
+0

Yeap, что сделал это. Большое спасибо. У вас есть объяснение этого поведения? –

2

Вы можете сделать так.

Это нарушит вашу круговую ошибку зависимости, и вы также сможете достичь своей цели.

Если я не ошибаюсь, вы просто хотите вызвать веб-службу в обработчике исключений.

var httpCallOnAngularError = angular.module('exceptionTestApp', []); 

/*httpCallOnAngularError.factory('$exceptionHandler', function() { 
return function (exception, cause) { 
     alert(exception.message); 
    }; 
});*/ 

httpCallOnAngularError.config(function ($provide) { 
    $provide.decorator("$exceptionHandler", function ($delegate, $injector) { 
     return function (exception, cause) { 
      var $rootScope = $injector.get('$rootScope'); 
      $delegate(exception, cause); 
      $rootScope.logAngularError(); 
      alert(exception.message); 
     }; 
    }); 
}); 
httpCallOnAngularError.run(function ($http, $rootScope) { 
    $rootScope.logAngularError = function() { 
     //Call your webservice here. 
     $http.get("http://jsonplaceholder.typicode.com/posts/1") 
       .success(function (response) { 
        console.log(JSON.stringify(response)); 
       }); 
    }; 

}); 

httpCallOnAngularError.controller('exceptionTestCtrl', function ($scope) { 
    throw {message: 'Log this error by calling webservice.'}; 
}); 

Вы можете подтвердить заказ этого шаблона.

<div ng-app="exceptionTestApp" ng-controller="exceptionTestCtrl"> 
</div> 

Webservice call in Exception Handler $http in $exceptionHandler

+0

Спасибо, Сатьям за вашу любезную помощь. Кажется, что ваш код работает по той же причине, что и для @maddygoround: ссылка на инжектор $ находится внутри функции. Я не понимаю, почему это работает, а не когда инжектор $ находится за пределами возвращаемой функции. Есть ли какой-нибудь прослушиватель событий при регистрации декораторов или что-то еще? У вас есть объяснение? –

Смежные вопросы