Я пытаюсь расширить $ log, предоставляемый AngularJS через .config() и $ delegate, чтобы я мог поймать все вызовы в $ log и $ broadcast. Таким образом, другие контроллеры могут поймать сообщения лога $ и обновляются независимо друг от друга другие части сайта:
var app = angular.module('testApp', [])
.config(function($provide) {
$provide.decorator('$log', function($delegate, $rootScope, logX) {
return logX($delegate);
});
})
.factory('logX', function() {
return function($delegate, $rootScope) {
return {
log: function() {
console.log('[log] ' + arguments[0]);
$rootScope.$broadcast('XXXlogXXX', arguments[0]);
},
info: function() {
console.info('[info] ' + arguments[0]);
$rootScope.$broadcast('XXXinfoXXX', arguments[0]);
},
error: function() {
console.error('[error] ' + arguments[0]);
$rootScope.$broadcast('XXXerrorXXX', arguments[0]);
},
warn: function() {
console.warn('[warning] ' + arguments[0]);
$rootScope.$broadcast('XXXwarningXXX', arguments[0]);
},
}
};
})
.controller('naCtrl', ['$scope', '$log',
function($scope, $log) {
$scope.init = function() {
$log.info('INIT INVOKED!');
};
}
]);
Однако, я получаю следующее исключение (http://jsfiddle.net/rtubio/yu3882nv/2/):
Error: [$injector:cdep] Circular dependency found: $log <- $exceptionHandler <- $rootScope
Я видел много примеров в Stackoverflow (например, example-1 или example-2), где очевидно, что $ rootScope можно использовать в рамках заводского метода. Я уверен, что это потому, что я вызываю метод .factory из .config, но я до сих пор не очень хорошо понимаю, как разбить эту зависимость. Является ли это возможным?
Я реализовал это решение в Fiddle (http://jsfiddle.net/rtubio/rfuzg0up/) и он не работает, он по-прежнему говорит, что круговая зависимость существует. Может быть, это связано с включением $ rootScope в зависимость от этого декоратора $ log? – Ricardo