Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 如何使用提供程序而不是函数来装饰$log服务_Angularjs_Angular Decorator - Fatal编程技术网

Angularjs 如何使用提供程序而不是函数来装饰$log服务

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

我试图在angularjs中修饰$log服务,以便通过http将日志发送到后端。我用这样的方法做到了这一点:

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()
消息