Ввод $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
Ответы
Ответ 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);
};
}