angularjs bindJQuery函数详解

ANGULARJS bindJQuery函数讲解

首先先上代码:
先看两个函数 这两个函数在接下来用得上。isUndefined和 isDefined
isUndefined函数定义如下:

   function isUndefined(value){
         return typeof value==='undefined';
     }

isUndefined这个函数判断value是否为‘undefined’类型。
只有value 为’undefined’类型时,都会返回 true.
如果value为null或其他类型,则这个函数都会返回 false;

isDefined函数如下:

   function isDefined(value){
       return typeof value!=='undefined';
       }

isDefined判断value值是否为’undefined’;
如果为undefined则返回false 否则其他的返回true

接下来看主函数 bindJQuery.

    var bindJQueryFired=false;
    function bindJQuery(){
        var originalCleanData;
        if(bindJQueryFired){
          return;
        }
        var jqName=jq();
        jQuery=isUndefined(jqName) ?window.jQuery:
                !jqName     ?  undefined  :
                window[jqName];
        if(jQuery&&JQuery.fn.on){
            jqLite=jQuery;
            extend(jQuery.fn,{
                   scope:jQLitePrototype.scope,
                   isolateScope:JQLitePrototype.isolateScope,
                   controller:JQLitePrototype.injector,
                   inheritedData:JQLitePrototype.inheritedData;
                   )};
            originalCleanData=jQuery.cleanData;
            jQuery.cleanData=function(elems){
                   var events;
                       for(var i=0,elem;(elem=elem[i]!=null;i++){
                          events=jQuery._data(elem,"events");
                          if(events&&events.$destroy){
                             jQuery(elem).triggerHandler('$destroy');
                          }
                        }
                   originalCleanData(elems);
                   };
         }else{
             jqLite=JQLite;
         }
         angular.element=jqLite;
         bindJQueryFired=true;]
以上就是bindJQuery的代码段,下面来分批进行介绍各部分作用。
var bindJQueryFired=false;   

这句话的作用相当与一个开关,首次加载的时候定义为开启状态,当满足某些条件后,自动关闭。

function bindJQuery(){
     /*定义变量 清除数据。关于angularJS的数据缓存,以及如何清理没有搞明白。
     如果你们懂的,可以给我施舍下哈,亲们。*/
     var originaCleanData;

     /*如果开关已开,则直接退出函数*/
     if(bindJQueryFired){
        return;
      /*定义了一个jq()函数并把它赋给 jqName*/
      var jqName=jq();}

既然使用了jq()这个函数,那么咋么来看看jq()这个函数怎么定义的

 function jq(){
       /*首先先判断有没有jq.name 如果有则直接返回,如果没有
        *则继续执行下面的代码。
        */                
       if(isDefined(jq.name_)){
          return jq.name_;
        }

       /*定义临时变量,存储从dom元素中查找到的elememnt*/
       var el;

       /*定义 变量 i 用于for循环*/
       var i;

       /* ngAttrPrefixes是一个数组,定义了首字节,用于记录
       * angularjs中所有可能出现的头字节。
       */
       var ngAttrPrefixes=['ng-','data-ng-','ng:','x-ng-'];

       /*定义变量ii 用于定义ngAttrPrefixes数组的长度*/
       var ii=ngAttrPrefixes.length;

       /*prefix 用于获取ngAttrPrefixes里的变量,用于for循环*/
       var prefix;

       /*定义name 获取el元素的属性值*/
       var name;

       for(i=0;i<ii.length;i++){
          /*遍历ngAttrPrfixes 并把内容赋给 prefix*/
          prefix=ngAttrPrefixes[i];

          /*在整个文档中查找元素或id或class中查找
          * ng-jq、data-ng-jq、ng\:jq、x-ng-jq这几个值,如果找到将它赋给el;
          * 如果没有找到直接跳过。
          * 当找到以上几个值后并赋给el后,查找这个元素上的属性名分别为
          * ng-jq、data-ng-jq、ng:jq、x-ng-jq
          */并将这些属性名上的值赋给name;
          if(el=window.document.querySelector('['+prefix.replace(':','\\:')+'jq]')){
              name=el.getAttribute(prefix+'jq');
              break;
          } 
       }
       /*最后将这个name值赋给jq.name*/
     return (jq.name_=name);
  };

jq()这个函数有什么作用?
接下来回到主函数 bindJQuery这个函数中。

 function bindJQuery(){
        var originalCleanData;
        if(bindJQueryFired){
          return;
        }

        /*获取到jq.name并将值赋给jqName*/
        var jqName=jq();

        /* 假设 jq()函数返回了一个值不是'undefined' */
        * 则isUndefined(jqName)返回值为true  jQuery=window.jQuery;*/
        * 如果jq()函数返回的是一个值 jq.name; */
        * 则isUndefined(jqName)返回false */
        * 首先先判读 !jqName是否为true */
        * (由于jqName现在返回的值有效,则现在的 !jqName为 false) */
        * 则 jQuery=window[jqName]; */
        * 什么时候会执行jQuery=undefined. */
        * 当jqName即不为js里定义的 string bool,number,null,object,undefined,以外的类型 */
        * 会执行jQuery=undefined; */
        * 应该防止程序出错而定义的。 */

        jQuery=isUndefined(jqName) ?window.jQuery:
                !jqName     ?  undefined  :
                window[jqName];

       /*前面一定给jQuery赋值 接下来判断是否有jQuery.fn.on这个函数。 */
       /* 将jQuery赋给angularjs自己定义的jqLite. */
       /* extend函数是在第一个参数下面添加其他的方法。 */
       /* 并且在jQuery.fn jQuery 原型下面添加几个方法。这几个方法,我还没有 */
       /* 琢磨,有时间在和大家分享。 */
      if(jQuery&&jQuery.fn.on){
         jqLite=jQuery;
         extend(jQuery.fn,{
           scope:jQLitePrototype.scope,
           isolateScope:JQLitePrototype.isolateScope,
           iniector:jQLitePrototype.injector,
           inheritedData:jQLitePrototype.inheritedData
           });

         originalCleanData=jQuery.cleanData;
        /*jQuery.cleanData这个函数没有看懂。*/
         jQuery.cleanData=function(elems){
            var events;
            for(var i=0,ele;(ele=elems[i])!=null;i++){
               events=jQuery._data(elem,"events");
               if(events&&events.$destroy){
                  jQuery(elem).triggerHandler('$desroy');
               }
             }
            originalCleanData(elems);
         };
      }else{
         jqLite=jQLite;
      }
      /*将jqLite赋给angular.element*/
     angular.element=jqLite;
      /*将开关关闭*/
     bindJQueryFired=true;

文章还在编写矫正中,有的地方肯定不足,请谅解 。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值