AngularJS实例 – 装饰$log

在AngularJS中,我们可以使用Angular内置或者自定义的services,在应用的各个部分之间分享数据和方法。假设你已经定义了一个service,但是在使用了一段时间之后又想要为这个service添加一些功能怎么办?方法之一当然是修改这个service的定义,直接在源码上动刀子。但是现在很多项目都需要通过团队协作来完成,直接修改别人的代码可能需要花费不少功夫,同时还要防范“牵一发而动全身”的风险。更进一步,如果你想给一些Angular内置的service添加功能怎么办,难道要我直接阅读angular.js的源码么?

当然,我们不需要去做以上这些事情,因为我们有更好的解决办法。Angular为我们提供了一种非常简单而优雅的方式来为service添加功能,它就是Angular中的decorator。有了它我们可以非常轻松的实现我们的目的。在一面的代码中,我们将对Angular内置service $log进行装饰,让它在每次被调用时除了自身接受的参数之外,还能在参数前面输出一个当前的时间戳。具体实现如下:

angular.module('myapp',[])
.config(function($provide){
$provide.decorator('$log',function($delegate){
angular.foreach(['log','debug','info','warn','error'],function(o){
$delegate[o] = decoratorLogger($delegate[o]);
});
function decoratorLogger(orignalFn){
return function(){
var args = Array.prototype.slice(arguments);
args.unshift(new Date().toISPString());
originalFn.apply(null,args);
};
}
});
});

上面的代码很简单,没有什么难点,关键的地方是在于decorator方法的回调函数的参数$delegate,它是decorator第一个参数代表的service的引用。现在我们就可以来验证一下刚才的进行装饰的$log service,在控制台中运行下面代码:

angular.element(document).injector().get('$log').log('hello')

结果输出:

2014-03-05T15:43:29.974Z hello

成功!

转:angular的decorator方法的更多相关文章

  1. angular 封装公共方法

    angular封装公共方法到service中间件,节省开发时间 layer.service.ts openAlert(callback) {// 传递回调函数 const dialogRef = th ...

  2. AngularJS的核心对象angular上的方法全面解析(AngularJS全局API)

    总结一下AngularJS的核心对象angular上的方法,也帮助自己学习一下平时工作中没怎么用到的方法,看能不能提高开发效率.我当前使用的Angularjs版本是1.5.5也是目前最新的稳定版本,不 ...

  3. 细说angular Form addControl方法

    在本篇博文中,我们将接触angular的验证.angular的验证是由form 指令和ngModel协调完成的.今天博主在这里想要说的是在验证在的一种特殊情况,当验证控件没有没有name属性这是不会被 ...

  4. angular的工具方法笔记(equals, HashKey)

    分别是angular脏值检测的工具方法equals和 类HashKey的使用方法 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transi ...

  5. angular.foreach 循环方法使用指南

    angular有自己的生命周期.循环给一个 angular监听的变量复值时.最好还是用angular自带的循环方法.“angular.foreach” },{a:}]; angular.forEach ...

  6. angular之$watch方法详解

    在$apply方法中提到过脏检查,首先apply方法会触发evel方法,当evel方法解析成功后,会去触发digest方法,digest方法会触发watch方法. (1)$watch简介 在diges ...

  7. [Angular] Angular Attribute Decorator - When to use it?

    When we pass value to a component, normally we use @Input. <my-comp [courses]="(courses$ | a ...

  8. [转]angular之$apply()方法

    这几天,根据buddy指定的任务,要分享一点angular JS的东西.对于一个在前端属于纯新手的我来说,Javascript都还是一知半解,要想直接上手angular JS,遇到的阻力还真是不少.不 ...

  9. ionic准备之angular基础——run方法(4)

    可以看到整个angular.module对象具有以下各种属性和方法 <!DOCTYPE html> <html lang="en"> <head> ...

随机推荐

  1. MySQL 中文显示乱码以及中文查询条件返回0条结果的问题解决

      最近关于中文显示乱码的贴子比较多,所以也做了个总结: 可以参考一下杨涛涛版主的<各种乱码问题汇总>http://topic.csdn.net/u/20071124/08/3b7eae6 ...

  2. jQuery滚动广告 解决子div绝对定位与父div重叠引起的闪烁问题

    这两天做了一个滚动广告栏的demo 功能有自动轮播 左右箭头移动 导航点选中图片移动效果 模仿的是新浪体育的广告 最难的问题就是子div绝对定位于父div 鼠标移入子div 系统会判定鼠标移出了父di ...

  3. C#学习日志 day7 --------------LINQ与Lamda语句的初步尝试以及XML的生成

    LINQ是一种集成在计算机语言里的信息查询语句,是c#3.0中最惹人瞩目的功能. 在C#中,LINQ语句有两种写法. 第一种写法与SQL语句类似: IEnumerable<Customer> ...

  4. hdu 2604Queuing dp+ 矩阵快速幂

    题目链接 给一个长度为n的字符串, 每个字符可以使f或m. 问你不包含子串fmf以及fff的字符串数量有多少. 令0表示mm结尾, 1表示mf, 2表示ff, 3表示fm. 那么 f(n+1, 0) ...

  5. GoF——组合模式

    组合模式:将对象组合成树形结构以表示“部分-真题”的结构层次.组合模式使得用户对单个对象和组合对象的使用具有一致性. 结构图: using System; using System.Collectio ...

  6. Servlet学习第一天--Servlet开发映射URL配置

    基础不扎实,从头学,认真记录笔记. 感谢@孤傲苍狼:http://www.cnblogs.com/xdp-gacl/p/3760336.html -为什么要配置? 由于客户端是通过URL访问web服务 ...

  7. zabbix 的安装

    第一步:官方的源: rpm -ivh http://repo.zabbix.com/zabbix/2.4/rhel/7/x86_64/zabbix-release-2.4-1.el7.noarch.r ...

  8. html---id,name和value

    id是唯一标识符,不允许有重复值(类似数据表的主键,pk),可以通过它的值来获得对应的html标签对象.(如果在同一页面代码中,出现重复的id,会导致不可预料的错误) js代码可通过document. ...

  9. ubuntu中如何关闭防火墙?

    只需要输入 root@stgman-desktop:~#  sudo ufw disable 防火墙在系统启动时自动禁用

  10. JSON.parse()的异常怎么处理;

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...