AngularJS中实现日志服务
本篇体验使用AngularJS自定义一个记录日志的服务。
在AngularJS中,服务的一些写法是这样的:
var app = angular.module('app',[]);
app.provider('providerName', function(){...});
app.service('serviceName', function(){});
app.factory('factoryName', function(){});
等同于:
app.config(['$provide', function($provide){
$provide.provider('providerName', function(){...});
}])
app.config(['$provide', function($provide){
$provide.service('serviceName', function(){...});
}])
app.config(['$provide', function($provide){
$provide.factory('factoryName', function(){...});
}])
而实际上,$provider.service()和$provider.factory()也可以通过$provider.provider()以注入的方式实现。
app.config(['$provide', function($provide){
$provide.service('serviceName', function(){
this.name = "";
this.author = "";
})
}])
以上等同于:
app.config(['$provide','$injector', function($provide, $injector){
$provide.provider('serviceName', function(){
this.$get = function($injector) {
return $injector.instantiate(function(){
this.name = "";
this.author = "";
});
}
});
}])
以上,也就是说,service本身就是一个provider,可以通过$injector来初始化一个service。
同理,我们这样写factory:
app.config(['$provide', function($provide){
$provide.factory('factoryName', function(){
return {name:'', author:''};
})
}])
以上等同于:
app.config(['$provide', '$injector',function($provide, $injector){
$provide.provider('factoryName', function(){
this.$get = function($injector){
return $injector.invoke(function(){
return {name:'', author:''}
})
}
})
}])
创建自己的provider
$provide.provider('appColor', function(){
var color = 'red';
this.setColor = function(newColor){
color = newColor;
}
thi.$get = function(){
return color;
}
})
我们可以在config中使用appColor这个自定义的provider的方法进行一些设置。
app.config(['appColorProvider', function(appColorProvider){
appColorProvider.setColor('green');
}])
然后在run中注入appColor这个服务。
app.run(['appColor', funciton(appColor){
console.log(appColor);
}])
创建日志服务
假设需要的日志格式如下:
<timestamp> - <context>::<method name>('<message>')
<timestamp> - <context>: <message>
创建一个有关日志的类:
var Logger = function(context){
this.context = context;
}
Logger.getInstance = function(context){
return new Logger(context);
}
//替代
Logger.supplant = function(str, o){
return str.replace(/\{([^{}]*)\}/g, function(a, b){
var r = o[b];
return typeof r === 'string' || typeof r === 'number' ? r:a;
})
}
//格式化时间
Logger.getFormattedTimestamp = funciton(date){
return Logger.supplant('{0}:{1}:{2}:{3}', [
date.getHours() ,
date.getMinutes(),
date.getSeconds(),
date.getMilleseconds()
]);
}
Logger.prototype = {
_log: function(originalFn, args){
var now = Logger.getFormattedTimestamp(new Date());
var message = '', supplantDate = [];
switch(args.length){
//打印格式:<timestamp> - <context>: <message>
case 1:
message = Logger.supplant("{0} - {1}:{2}", [now, this.context, args[0]]);
break;
case 3:
//打印格式:<timestamp> - <context>::<method name>('<message>')
//第一个参数是方法名
//第二个参数是消息
//第三各参数是对象
supplantData = args[2];
message = Logger.supplant("{0} - {1}::{1}(\'{3}\')",[now, this.context, args[0], args[1]]);
break;
case 2:
//检测第二个参数类型
if(typeof args[1] === 'string'){
message = Logger.supplant("{0} - {1}::{2}(\'{3}\')",[now, this.context, args[0], args[1]]);
} else {
sup;antData = args[1];
message = Logger.supplant("{0} - {1}:{2}", [now, this.context.args[0]])
}
break;
}
$log[originalFn].call(null, Logger.supplant(message, suppantData));
},
log: function(){
this._log('log', arguments);
},
info: function(){
this._log('info', arguments);
},
warn: function(){
this._log('warn', arguments);
},
debug: function(){
this._log('debug', argments);
},
error: function(){
this._log('error', arguments);
}
};
我们可能按如下使用这个日志类:
//Example是类或文件或module的名称
var logger = Logger.getInstance('Example');
logger.log('this is a alog');
logger.warn('warn', 'this is a worn');
logger.error('this is a {0} error {1}',['big','hello']);
完整代码如下:
app.provider('Logger', [function(){
var isEnabled = true;
this.enabled = function(_isEnabled){
isEnabled = !!_isEnabled;
}
this.$get = ['$log', function($log){
var Logger = function(context){
this.context = context;
}
Logger.getInstance = function(context){
return new Logger(context);
}
//替代
Logger.supplant = function(str, o){
return str.replace(/\{([^{}]*)\}/g, function(a, b){
var r = o[b];
return typeof r === 'string' || typeof r === 'number' ? r:a;
})
}
//格式化时间
Logger.getFormattedTimestamp = funciton(date){
return Logger.supplant('{0}:{1}:{2}:{3}', [
date.getHours() ,
date.getMinutes(),
date.getSeconds(),
date.getMilleseconds()
]);
}
Logger.prototype = {
_log: function(originalFn, args){
if(!isEnabled){
return;
}
var now = Logger.getFormattedTimestamp(new Date());
var message = '', supplantDate = [];
switch(args.length){
//打印格式:<timestamp> - <context>: <message>
case 1:
message = Logger.supplant("{0} - {1}:{2}", [now, this.context, args[0]]);
break;
case 3:
//打印格式:<timestamp> - <context>::<method name>('<message>')
//第一个参数是方法名
//第二个参数是消息
//第三各参数是对象
supplantData = args[2];
message = Logger.supplant("{0} - {1}::{1}(\'{3}\')",[now, this.context, args[0], args[1]]);
break;
case 2:
//检测第二个参数类型
if(typeof args[1] === 'string'){
message = Logger.supplant("{0} - {1}::{2}(\'{3}\')",[now, this.context, args[0], args[1]]);
} else {
sup;antData = args[1];
message = Logger.supplant("{0} - {1}:{2}", [now, this.context.args[0]])
}
break;
}
$log[originalFn].call(null, Logger.supplant(message, suppantData));
},
log: function(){
this._log('log', arguments);
},
info: function(){
this._log('info', arguments);
},
warn: function(){
this._log('warn', arguments);
},
debug: function(){
this._log('debug', argments);
},
error: function(){
this._log('error', arguments);
}
};
return Logger;
}]
}])
在全局关闭自定义的Logger。
app.config(['LoggerProvider', function(LoggerProvider){
LoogerProvider.enabled(false);
}])
参考:http://www.webdeveasy.com/service-providers-in-angularjs-and-logger-implementation/
AngularJS中实现日志服务的更多相关文章
- 【AngularJS中的自定义服务service VS factory VS provider】---它们的区别,你知道么?
在介绍AngularJS自定义服务之前,我们先来了解一下AngularJS~ 学过HTML的人都知道,HTML是一门很好的伪静态文本展示设计的声明式语言,但是,要构建WEB应用的话它就显得乏力了. 而 ...
- angularJS中如何写服务
服务的用途 服务提供了一种能在应用的整个生命周期内保持数据的方法,它能够在控制器之间进行通信,并且能保证数据的一致性 服务提供了把特定功能相关联的方法集中在一起的接口 如何创建服务 angularJS ...
- AngularJS中的http服务的简单用法
我们可以使用内置的$http服务直接同外部进行通信.$http服务只是简单的封装了浏览器原生的XMLHttpRequest对象. 1.链式调用 $http服务是只能接受一个参数的函数,这个参数是一个对 ...
- 自定义AngularJS中的services服务
<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...
- AngularJs中的服务
一.angularJs中的简单服务应用 下面的例子让我们明白在AngularJs中如何去调用文件中的数据,从而将文件中的数据显示在页面上;改变url的地址,也可以去调用后台接口. 实例: <!D ...
- 使用日志服务进行Kubernetes日志采集
阿里云容器服务Kubernetes集群集成了日志服务(SLS),您可在创建集群时启用日志服务,快速采集Kubernetes 集群的容器日志,包括容器的标准输出以及容器内的文本文件. 新建 Kubern ...
- AngularJS 中的Promise --- $q服务详解
先说说什么是Promise,什么是$q吧.Promise是一种异步处理模式,有很多的实现方式,比如著名的Kris Kwal's Q还有JQuery的Deffered. 什么是Promise 以前了解过 ...
- REST服务中的日志可视化(关键技术实现)
引言 在系统构建完成之后,我们通常会使用REST API对外提供服务,在REST API的处理过程中经常会出现一些异想不到的问题(用户权限不足.参数不全.数据库访问异常等),导致请求失败,很多时候用户 ...
- 怎么理解angularjs中的服务?
AngularJS中的服务其实就是提供一种方式抽取共用类库 比如说一些工具类方法,我们传统的做法就是自己写个 utility 类,把相关的工具方法填充到utility里面去,最后把utility类放到 ...
随机推荐
- 第一章 第一个spring boot程序(转载)
第一章 第一个spring boot程序 本编博客转发自:http://www.cnblogs.com/java-zhao/p/5324185.html 环境: jdk:1.8.0_73 mave ...
- zendstudio 声明变量类型,让变量自动方法提示
zendstudio 行内注释, 显式声明变量类型,让变量自动方法提示 $out = []; /* @var $row \xxyy\SizeEntity */ foreach ($rows[ 'lis ...
- MVC 路由模块内核原理
.net网站第一次运行的时候 执行global文件的application_start方法 注册路由信息 RouteConfig.RegisterRoutes(RouteTable.Routes) ...
- Device Tree Usage( DTS文件语法)
http://elinux.org/Device_Tree_Usage Device Tree Usage Top Device Tree page This page walks throu ...
- Til the Cows Come Home
Description Bessie is out in the field and wants to get back to the barn to get as much sleep as pos ...
- PowerDesigner 建模
File—New Model—Physical Data Model—Physical Diagram—Model name设置为test,DBMS属性设置为Microsoft SQL Server ...
- SpringMVC配置入門
我的開發環境 開發工具: springsource-tool-suite-2.9.0 JDK版本: 1.6.0_29 tomcat版本:apache-tomcat-7.0.26 本文地址: ...
- WPF RichTextBox,关键字搜索,样式改变,超链接替换,图文混排
RichTextBox 只是一个控件,表示对 FlowDocument 对象执行操作的丰富编辑控件.它所承载的内容由其 Document 属性来呈现. Document 是一个 FlowDocumen ...
- [Leetcode][JAVA] Best Time to Buy and Sell Stock I, II, III
Best Time to Buy and Sell Stock Say you have an array for which the ith element is the price of a gi ...
- postgresql 配置文件优化
postgresql 配置文件优化 配置文件 默认的配置配置文件是保存在/etc/postgresql/VERSION/main目录下的postgresql.conf文件 如果想查看参数修改是否生效, ...