$rootScope和工厂方法
$rootScope and factory methods
我正试图通过.config()和$delegate扩展AngularJS提供的$log,这样我就可以捕获对$log的所有调用并对其进行$broadcast。通过这种方式,其他控制器可以捕捉$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方法,但我仍然不太清楚如何打破这种依赖关系。有可能吗?
因此,您不能直接引入logx,因为您在.config()块中。
相反,引入$injector服务并在日志委托中获取logx服务。
同样,你的装饰师并没有像更换记录器那样多地进行装饰。如果这是您的意图,那么您可以创建自己的$log服务,而不是使用decorator。
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);
. . .
}
});})
相关文章:
- AngularJS:$q.dedefe()不能由工厂方法共享
- AngularJS错误:提供程序必须从$get工厂方法返回值
- 修复AngularJS错误:提供程序必须从$get工厂方法返回值
- 有没有一种方法可以在设计模式下将ng模型或工厂绑定到iframe
- 如何重用ajax工厂方法来设置$scoped变量
- 从角度工厂或指令导出方法以供以后使用
- angular.js:13424 ReferenceError:在控制器中使用工厂方法时未定义索引
- Angularjs-向工厂传递数据的方法不起作用
- 如何从变量中动态调用工厂方法
- jasmine 2.0测试angularjs的工厂方法,这是一个承诺
- 如何访问控制器内的工厂方法
- 工厂方法似乎未定义
- 调用工厂方法时出现 Angularjs 错误
- 尝试在 JavaScript 中使用工厂调用方法时未定义
- 如何使用getter和setter方法创建一个Angular工厂而不遇到竞争条件
- 在angularjs工厂方法中添加事件侦听器无法按预期工作
- 如何在Angular中的工厂方法中返回数据
- 工厂方法没有't return-TypeError:无法读取属性'那么'的未定义
- AngularJS-错误:[$injector:pget]提供程序'函数()'必须定义$get工厂方法
- $rootScope和工厂方法