angular学习之一(ng-click源码)

首先贴出ng-click实现的源码,我做了一些注释

forEach(//依次生成ng-click/ng-dblclick...
  'click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress submit focus blur copy cut paste'.split(' '),
  function(eventName) {//@eventName 'click'
    var directiveName = directiveNormalize('ng-' + eventName);//将'ng-click'转化成'ngClick'
    //得到全局变量ngEventDirectives,用于生成directive
    ngEventDirectives[directiveName] = ['$parse', '$rootScope', function($parse, $rootScope) {
      //知道directive就知道这是干嘛的,不知道的可以先搜一下directive
      return {
        restrict: 'A',
        compile: function($element, attr) {
          // 根据ng-click中的表达式转换成一个function fn,关于$parse服务的详细说明下面会提一下
          var fn = $parse(attr[directiveName], /* interceptorFn */ null, /* expensiveChecks */ true);
          return function ngEventHandler(scope, element) {
            //绑定click事件
            element.on(eventName, function(event) {
              var callback = function() {
                fn(scope, {$event:event});
              };
              //forceAsyncEvents={'blur':true,'focus':true}
              // 如果是blur,focus事件则异步调用【个人认为是为了响应流畅,有其它见解请不吝赐教】
              if (forceAsyncEvents[eventName] && $rootScope.$$phase) {
                scope.$evalAsync(callback);
              } else {
                scope.$apply(callback);
              }
            });
          };
        }
      };
    }];
  }
);

只要听说过angular的service,directive理解起来没什么问题
根据它很容易写出监听其它事件的directive

.directive('ngTap', ['$parse',function($parse) {
  return {
   restrict: 'A',
   compile: function($element, attr) {
    var fn = $parse(attr["ngTap"]);
    return function ngEventHandler(scope, element) {
     element.on('tap', function(event) {
      var callback = function() {
       fn(scope, {
        $event: event
       });
      };
      scope.$apply(callback);
     });
    };
   }
  };
 }])

这里主要提一下$parse服务
例子

  • $parse
  • 作用:将一个AngularJS表达式转换成一个函数
  • Usage
  • $parse(expression)
  • arguments
  • expression:string,需要被编译的AngularJS语句,'::'开头表示当表达式的值为undefine时忽略拦截函数,直接返回undefined
  • interceptorFn:function,拦截函数,形式interceptorFn(value, scope, locals),value是表达式的值
  • expensiveCheck:bool,使用cacheExpensive并且做更多的检查,check if obj is Function that is fast and works across iframes and other contexts?
  • return
  • returnsfunc(context, locals)
    • context[object]:针对你要解析的语句,这个对象中含有你要解析的语句中的表达式(通常是一个scope object)
    • locals[object]: 关于context中变量的本地变量,对于覆盖context中的变量值很有用。
    • 返回的函数还有下面三个特性:
      • literal[boolean]:表达式的顶节点是否是一个javascript字面量
      • constant[boolean]:表达式是否全部是由javascript的常量字面量组成
      • assign[func(context, local)]:可以用来在给定的上下文中修改表达式的值
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容