Angularjs 如何使用提供程序而不是函数来装饰$log服务
我试图在angularjs中修饰$log服务,以便通过http将日志发送到后端。我用这样的方法做到了这一点:Angularjs 如何使用提供程序而不是函数来装饰$log服务,angularjs,angular-decorator,Angularjs,Angular Decorator,我试图在angularjs中修饰$log服务,以便通过http将日志发送到后端。我用这样的方法做到了这一点: app.config(['$provide', function ($provide) { $provide.decorator('$log', ['$delegate', loggerDecorator]); }]); var loggerDecorator = function ($delegate) { ...decorating logic $delegat
app.config(['$provide', function ($provide) {
$provide.decorator('$log', ['$delegate', loggerDecorator]);
}]);
var loggerDecorator = function ($delegate) {
...decorating logic
$delegate.log = prepareLogFn($delegate.log);
return $delegate;
}
angular.module('mods.logging').factory(serviceId, [backendLoggingDecorator]);
function backendLoggingDecorator() {
var remoteUri = '';
return {
setRemoteUri: function (uri) {
remoteUri = uri;
},
$get: function ($delegate) {
var ajaxLogger = log4javascript.getLogger();
var ajaxAppender = new log4javascript.AjaxAppender(remoteUri);
ajaxAppender.setThreshold(log4javascript.Level.ALL);
ajaxLogger.addAppender(ajaxAppender);
function prepareLogFn(loggingFunc) {
return function () {
if (ajaxLogger) ajaxLogger.info(arguments);
loggingFunc.apply(null, args);
};
}
$delegate.log = prepareLogFn($delegate.log);
return $delegate;
}
};
}
这很好,但是,我更喜欢使用一个提供程序作为装饰程序,这样我就可以在模块的配置阶段对其进行配置,以设置分隔符、远程api url等内容
我尝试创建如下提供程序:
app.config(['$provide', function ($provide) {
$provide.decorator('$log', ['$delegate', loggerDecorator]);
}]);
var loggerDecorator = function ($delegate) {
...decorating logic
$delegate.log = prepareLogFn($delegate.log);
return $delegate;
}
angular.module('mods.logging').factory(serviceId, [backendLoggingDecorator]);
function backendLoggingDecorator() {
var remoteUri = '';
return {
setRemoteUri: function (uri) {
remoteUri = uri;
},
$get: function ($delegate) {
var ajaxLogger = log4javascript.getLogger();
var ajaxAppender = new log4javascript.AjaxAppender(remoteUri);
ajaxAppender.setThreshold(log4javascript.Level.ALL);
ajaxLogger.addAppender(ajaxAppender);
function prepareLogFn(loggingFunc) {
return function () {
if (ajaxLogger) ajaxLogger.info(arguments);
loggingFunc.apply(null, args);
};
}
$delegate.log = prepareLogFn($delegate.log);
return $delegate;
}
};
}
然后做一些类似的事情:
app.config(['$provide', function ($provide) {
$provide.decorator('$log', ['backendLoggingDecorator', function(bld) {
return bld;
}]);
}]);
但是我对如何在提供者内部传递实际的$delegate并将其返回给decorator感到困惑。这里有一个示例。在
enhanceLogging
功能中,您可以对日志执行任何操作,使用额外信息装饰日志,将日志发布到外部服务,等等
var myApp=angular.module('myApp',[]).provider('logEnhancer',[function(){
此。$get=函数(){
返回{
enhanceAngularLog:函数($log){
$log.getInstance=函数(上下文){
返回{
日志:增强日志($log.log,context,'log'),
信息:增强日志($log.info,context,'info'),
warn:enhanceLogging($log.warn,context,'warn'),
调试:增强日志记录($log.debug,上下文“debug”),
错误:增强日志($log.error,上下文“error”)
};
}
函数增强日志记录(loggingFunc、上下文、级别){
返回函数(){
var modifiedArguments=[].slice.call(参数);
modifiedArguments[0]=moment().format('ddddd h:mm:ss a')+'| |'+modifiedArguments[0]+'| |来自Ctrl:'+context;
loggingFunc.apply(null,modifiedArguments);
};
}
}
};
};
}]).run(['$log','logEnhancer',函数($log,logEnhancer){
logEnhancer.enhanceAngularLog($log);
}]).controller('LogCtrl',['$log','$scope',函数($log,$scope){
var$log=$log.getInstance('LogCtrl');
$scope.doTest=函数(){
$log.debug(“此*将*显示在您的控制台中”);
};
}]);代码>
增强$log服务
测试记录器
在控制台中查找修改后的$log.debug()
消息