angular 源码分析 1 - angularInit()

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()方法

时间: 2024-12-17 08:31:14

angular 源码分析 1 - angularInit()的相关文章

angular源码分析一

1.angular 初始化流程 function(window, document, undefined) {  //定位到4939行,这里是angularjs开始执行初始化的地方,见代码      styleDirective = valueFn({        restrict: "E",        terminal: !0     });  bindJQuery(), publishExternalAPI(angular), jqLite(document).ready(f

angular源码分析:图解angular的启动流程

今天做了一些图来说明angular,由于angular实在太复杂了,不知道用什么图表示比较好,所以就胡乱画了一些,希望有人能看得懂. 一.源码文件编译合并顺序图 二.angular.module函数功能图 三.publishExternalAPI函数功能图 四.注入器工厂函数createInjector内部的providerCache和instanceCache

angular源码分析3-$provide

$provide是angular内部的初始化时自定义的一个服务,存储在provideCache对象中.用于模块注册provider.service.factory等服务.如下图所示: 下面看$provide实例:

angular源码分析 摘抄 王大鹏 博客 directive指令及系列

链接地址:http://www.cnblogs.com/web2-developer/p/angular-14.html $compile的功能:将一个html字符串或者一个DOM进行编译,返回一个链接函数.链接函数将作用域和模板链接在一起,编译的实质是遍历DOM树,匹配和处理DOM树上的指令. angularjs directive 实例 详解 http://blog.51yip.com/jsjquery/1607.html

angularjs源码分析之:angularjs执行流程

angularjs用了快一个月了,最难的不是代码本身,而是学会怎么用angular的思路思考问题.其中涉及到很多概念,比如:directive,controller,service,compile,link,scope,isolate scope,双向绑定,mvvm等.最近准备把这些都慢慢搞懂,分析源码并贴到博客园,如有分析不对的地方,还望各位包容并指正. angularjs源码分析之:angularjs执行流程 先上个大图,有个大概印象,注:angularjs的版本为:1.2.1,通过bowe

AngularJS 源码分析1

AngularJS简介 angularjs 是google出品的一款MVVM前端框架,包含一个精简的类jquery库,创新的开发了以指令的方式来组件化前端开发,可以去它的官网看看,请戳这里 再贴上一个本文源码分析对应的angularjs源码合并版本1.2.4,精简版的,除掉了所有的注释, 请戳这里 从启动开始说起 定位到4939行,这里是angularjs开始执行初始化的地方,见代码 ? 1 2 3 bindJQuery(), publishExternalAPI(angular), jqLit

AngularJS 源码分析3

本文接着上一篇讲 回顾 上次说到了rootScope里的$watch方法中的解析监控表达式,即而引出了对parse的分析,今天我们接着这里继续挖代码. $watch续 先上一块$watch代码 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 $watch: function(watchExp, listener, obj

Angularjs 源码分析2

本文主要分析RootScopeProvider和ParseProvider RootScopeProvider简介 今天这个rootscope可是angularjs里面比较活跃的一个provider,大家可以理解为一个模型M或者VM,它主要负责与控制器或者指令进行数据交互. 今天使用的源码跟上次分析的一样也是1.2.X系列,只不过这次用的是未压缩合并版的,方便大家阅读,可以在这里下载 从$get属性说起 说起这个$get属性,是每个系统provider都有的,主要是先保存要实例化的函数体,等待i

angular源码阅读的起点,setupModuleLoader方法

angular源码其实结构非常清晰,划分的有条有理的,大概就是这样子: (function(window,document,jquery,undefined){ //一些工具函数 //EXPR 编译器 自执行 //setupModuleLoader方法,公司内部的框架是vxsetup方法,(只是定义,没有调用) //moduler方法() //angular初始化方法,公司内部的框架是vxinit方法 //bootstrap //createInjector //一系列指令,服务,过滤器等指令