我正在尝试通过.config()和$ delegate扩展AngularJS提供的$ log,这样我就可以捕获所有对$ log和$广播的调用。这样,其他控制器可以捕获$ log消息并独立更新网站的其他部分:
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方法,但我仍然不太清楚如何打破这种依赖。有可能吗?
答案 0 :(得分:1)
因此,您无法直接引入logx,就像您在.config()块中一样。
相反,引入$ injector服务并在日志委托中获取logx服务。
同样,你的装饰者不会像更换记录器一样装饰。如果这是你的意图,你可以创建自己的$ log服务,而不是使用装饰器。
var app = angular.module('testApp', [])
.config(function($provide) {
$provide.decorator('$log', function($delegate, $rootScope, $injector) {
var originalLog = $delegate.log;
var originalError = $delegate.error;
. . .
$delegate.log = function() {
var logx = $injector.get('logx');
originalLog.apply(null, arguments);
originalError.apply(null, arguments);
. . .
logx.log(arguments);
logx.error(arguments);
. . .
}
});})