Hea*_*rts 5 logging http decorator angularjs
我正在尝试扩展$log服务,以便它也向服务器发送消息.我从Angular" 循环依赖发现 "作为$http用途收到错误$log.
app.js:
angular.module("app").config(function($provide) {
$provide.decorator("$log", function($delegate, NodeLogger) {
var logFn = $delegate.log;
$delegate.log = function(message) {
NodeLogger.log(message);
logFn.apply(null, arguments);
};
});
});
Run Code Online (Sandbox Code Playgroud)
NodeLogger.js:
angular.module("app").factory("NodeLogger", function($http) {
function log(type, message) {
var logMessage = type + ":" + message;
$http.post("http://localhost:3000/log", "message=" + logMessage);
}
return {
log: log
}
});
Run Code Online (Sandbox Code Playgroud)
我已经尝试使用$injectorin app.js来加载$http并只是发出POST请求,但它给出了同样的错误.有办法解决这个问题吗?我可以避免使用$http/ $resource?
谢谢!
这是循环依赖的一个常见问题,当$http已经注入$log并通过注入你的工厂装饰它NodeLogger注入$http你正在创建循环依赖.而不是直接从工厂注入工厂从喷射器获取工厂,另一种方法是$injector在工厂注入并$http从喷射器获取实例而不是$http直接注入.这样可以避免在工厂创建期间出现循环依赖.一个重要的注意事项是返回,$delegate否则$log服务将不会包含任何实例.
$provide.decorator("$log", function($delegate, $injector) {
var logFn = $delegate.log;
$delegate.log = function(message) {
//Get NodeLogger factory instance from injector
var NodeLogger = $injector.get('NodeLogger');
NodeLogger.log(message);
logFn.apply(null, arguments);
};
//Return the delegate
return $delegate;
});
Run Code Online (Sandbox Code Playgroud)
angular.module("app", []).factory("NodeLogger", function($http) {
function log(type, message) {
var logMessage = type + ":" + message;
$http.post("http://localhost:3000/log", "message=" + logMessage);
}
return {
log: log
}
}).config(function($provide) {
$provide.decorator("$log", function($delegate, $injector) {
var logFn = $delegate.log;
$delegate.log = function(message) {
var NodeLogger = $injector.get('NodeLogger');
NodeLogger.log(message);
logFn.apply(null, arguments);
};
return $delegate;
});
}).run(function($log) {
$log.log("Hey");
});;Run Code Online (Sandbox Code Playgroud)
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js"></script>
<div ng-app="app"></div>Run Code Online (Sandbox Code Playgroud)