[英]$rootScope and factory methods
我正在尝试通过.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方法,但是我仍然不太了解如何打破这种依赖性。 可能吗?
因此,您无法像在.config()块中那样直接输入您的logx。
而是引入$ 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);
. . .
}
});})
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.