1
我想通過.config()和$ delegate擴展AngularJS提供的$日誌,這樣我就可以捕獲所有對$ 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可以在工廠方法中使用。我很確定這是因爲我從.config文件中調用了.factory方法,但我仍然不明白如何打破這種依賴關係。可能嗎?
我在一個小提琴中實現了這個解決方案(http://jsfiddle.net/rtubio/rfuzg0up/),它不起作用,它仍然說存在循環依賴。可能它與將$ rootScope作爲這個$ log裝飾器的依賴關係相關? – Ricardo 2014-10-03 18:15:10