zoukankan      html  css  js  c++  java
  • angular 源码分析 1

         angularjs 是个神奇的框架,由于我的好奇,想了解她的内部工作原理,只能一步一步的走进她,靠近她,和她深入的交流。

         angularjs 的入口是什么样子的呢?一起掀起她的盖头吧。

        在这里我只讲方法,具体的行号不做记录,自己找吧(Ctrl+F);

     入口是这样的:

    jqLite(document).ready(function() {
      angularInit(document, bootstrap);
    });

    原理简单,就是获取document ready 结束时,调用angularInit(document, bootstrap);  我们今天的重头戏是angularInit()方法, 暂时不讲bootstrap。

     1   var ngAttrPrefixes = ['ng-', 'data-ng-', 'ng:', 'x-ng-'];
     2     function angularInit(element, bootstrap) {
     3         var appElement,
     4             module,
     5             config = {};
     6 
     7         // The element `element` has priority over any other element
     8         forEach(ngAttrPrefixes, function(prefix) {
     9             var name = prefix + 'app';
    10 
    11             if (!appElement && element.hasAttribute && element.hasAttribute(name)) {
    12                 appElement = element;
    13                 module = element.getAttribute(name);
    14             }
    15         });
    16         forEach(ngAttrPrefixes, function(prefix) {
    17             var name = prefix + 'app';
    18             var candidate;
    19 
    20             if (!appElement && (candidate = element.querySelector('[' + name.replace(':', '\:') + ']'))) {
    21                 appElement = candidate;
    22                 module = candidate.getAttribute(name);
    23             }
    24         });
    25         if (appElement) {
    26             config.strictDi = getNgAttribute(appElement, "strict-di") !== null;
    27             bootstrap(appElement, module ? [module] : [], config);
    28         }
    29     }

         这个方法就是angularjs 获取ng-app (['ng-', 'data-ng-', 'ng:', 'x-ng-'] app有这几种写法)的方法, 8~24行都是为了寻找整个页面中的app属性,此时只会获取第一个带有app的属性元素,这也是为什么一个程序中只能有一个app的原因,如果找到了带有app的属性,就执行26~27行代码,如果没有找到,对不起,angularjs 没有了卵用,这就为什么必须刚开始写ng-app="XXXX"。

         那么26行是什么意思呢?

     1  function getNgAttribute(element, ngAttr) {
     2         var attr, i, ii = ngAttrPrefixes.length;
     3         for (i = 0; i < ii; ++i) {
     4             attr = ngAttrPrefixes[i] + ngAttr;
     5             if (isString(attr = element.getAttribute(attr))) {
     6                 return attr;
     7             }
     8         }
     9         return null;
    10     }

       就是判断 是严格模式吗,即在app的元素上 写ng-strict-di属性了吗,当找到了就返回获取的属性值,没有找到就返回null;

    你可能有疑惑什么是严格模式,自己看看吧,https://docs.angularjs.org/api/ng/directive/ngApp  搜搜“ ngStrictDi ”,自己可以试试。

    执行完getNgAttribute() 返回的值进行判断后 赋给了config.strictDi(true/false)。

    好了,先讲这些吧,下次讲讲bootstrap()方法

  • 相关阅读:
    VC++ 调用C# dll 回调函数,实现MQTT协议客户端通信
    如何正确获取ADO连接MySql的连接字符串(转载)
    SQL 操作
    MFC如何添加背景图片(转载)
    MFC CFont 要释放的资源总结
    MFC控件 Edit,控制只能输入数字和小数点
    VC MFC 获取 IP地址和MAC地址程序
    MFC CString 转 CTime
    vc mfc 写excel文件,包括数据和图表
    ADO方式操作access数据库
  • 原文地址:https://www.cnblogs.com/zhangkunweb/p/5630040.html
Copyright © 2011-2022 走看看