AngularJS 执行流程详细介绍


Posted in Javascript onAugust 18, 2016

一、启动阶段

        大家应该都知道,当浏览器加载一个HTML页面时,它会将HMTL页面先解析成DOM树,然后逐个加载DOM树中的每一个元素节点。我们可以把AngularJS当做一个类似jQuery的js库,我们通过<script>标签引入到HTML中,那么此时Angular就做为一个普通的DOM节点等待浏览器解析,当浏览器解析到这个节点时,发现它是一个js文件,那么浏览器会停止解析剩余的DOM节点,开始执行这个js(即angular.js),同时Angular会设置一个事件监听器来监听浏览器的DOMContentLoaded事件。当Angular监听到这个事件时,就会启动Angular应用。

        二、初始化阶段

        Angular开始启动后,它会查找ng-app指令,然后初始化一系列必要的组件(即$injector、$compile服务以及$rootScope),接着重新开始解析DOM树。

        三、编译、链接

        $compile服务通过遍历DOM树的方式查找有声明指令的DOM元素。当碰到带有一个或多个指令的DOM元素时,它会排序这些指令(基于指令的priority优先级),然后使用$injector服务查找和收集指令的compile函数并执行它。

        每个节点的编译方法运行之后,$compile服务就会调用链接函数。这个链接函数为绑定了封闭作用域的指令设置监控。这一行为会创建实时视图。

        最后,在$compile服务完成后,AngularJS运行时就准备好了。

        四、运行阶段

        Angular提供了自己的事件循环。指令自身会注册事件监听器,因此当事件被触发时,指令函数就会运行在AngularJS的$digest循环中。$digest循环会等待$watch表达式列表,当检测到模型变化后,就会调用$watch函数,然后再次查看$watch列表以确保没有模型被改变。

        一旦$digest循环稳定下来,并且检测到没有潜在的变化了,执行过程就会离开Angular上下文并且通常会回到浏览器中,DOM将会被渲染到这里。

        将以上过程的关键步骤绘制成一张图,如下:

AngularJS 执行流程详细介绍

以上就是AngularJS 执行流程的详细介绍,后续继续整理相关资料,谢谢大家对本站的支持。

Javascript 相关文章推荐
jquery的index方法实现tab效果
Feb 16 Javascript
ie支持function.bind()方法实现代码
Dec 27 Javascript
定时器(setTimeout/setInterval)调用带参函数失效解决方法
Mar 26 Javascript
JS实现多物体缓冲运动实例代码
Nov 29 Javascript
node.js中Socket.IO的进阶使用技巧
Nov 04 Javascript
JS打字效果的动态菜单代码分享
Aug 21 Javascript
基于zepto的移动端轻量级日期插件--date_picker
Mar 04 Javascript
Node.js中防止错误导致的进程阻塞的方法
Aug 11 Javascript
el-input 标签中密码的显示和隐藏功能的实例代码
Jul 19 Javascript
layui下拉框获取下拉值(select)的例子
Sep 10 Javascript
vue-autoui自匹配webapi的UI控件的实现
Mar 20 Javascript
如何让vue长列表快速加载
Mar 29 Vue.js
AngularJS国际化详解及示例代码
Aug 18 #Javascript
ECMAScript6轮播图实践知识总结
Aug 17 #Javascript
jQuery 全选 全部选 反选 实现代码
Aug 17 #Javascript
AngularJS 自定义指令详解及示例代码
Aug 17 #Javascript
AngularJS 依赖注入详解及示例代码
Aug 17 #Javascript
AngularJS 服务详细讲解及示例代码
Aug 17 #Javascript
深入理解jQuery layui分页控件的使用
Aug 17 #Javascript
You might like
使用XDebug调试及单元测试覆盖率分析
2011/01/27 PHP
php简单socket服务器客户端代码实例
2015/05/18 PHP
PHP计算加权平均数的方法
2015/07/16 PHP
基于PHP生成简单的验证码
2016/06/01 PHP
phpstudy2018升级MySQL5.5为5.7教程(图文)
2018/10/24 PHP
PHP5.6.8连接SQL Server 2008 R2数据库常用技巧分析总结
2019/05/06 PHP
PHP观察者模式实例分析【对比JS观察者模式】
2019/05/22 PHP
php遍历目录下文件并按修改时间排序操作示例
2019/07/12 PHP
QUnit jQuery的TDD框架
2010/11/04 Javascript
一个简单的Node.js异步操作管理器分享
2014/04/29 Javascript
js变量、作用域及内存详解
2014/09/23 Javascript
jQuery四种选择器使用及示例
2016/06/05 Javascript
vue+vux实现移动端文件上传样式
2017/07/28 Javascript
5分钟学会Vue动画效果(小结)
2018/07/21 Javascript
微信小程序实现滴滴导航tab切换效果
2018/07/24 Javascript
Next.js实现react服务器端渲染的方法示例
2019/01/06 Javascript
vue踩坑记录之数组定义和赋值问题
2019/03/20 Javascript
js如何获取访问IP、地区、当前操作浏览器
2019/07/23 Javascript
React+TypeScript+webpack4多入口配置详解
2019/08/08 Javascript
js消除图片小游戏代码
2019/12/11 Javascript
JS如何判断对象是否包含某个属性
2020/08/29 Javascript
[02:43]DOTA2亚洲邀请赛场馆攻略——带你走进东方体育中心
2018/03/19 DOTA
[01:06]DOTA2小知识课堂 Ep.01 TP出门不要忘记帮队友灌瓶哦
2019/12/05 DOTA
[47:43]完美世界DOTA2联赛PWL S3 Magama vs GXR 第二场 12.19
2020/12/24 DOTA
Python中的pprint折腾记
2015/01/21 Python
Python中Selenium模拟JQuery滑动解锁实例
2017/07/26 Python
python实现图片处理和特征提取详解
2017/11/13 Python
django模板语法学习之include示例详解
2017/12/17 Python
Window版下在Jupyter中编写TensorFlow的环境搭建
2020/04/10 Python
巴基斯坦购物网站:Goto
2019/03/11 全球购物
业务助理岗位职责
2013/11/18 职场文书
中班下学期个人工作总结
2015/02/12 职场文书
教师学习十八届五中全会精神心得体会
2016/01/05 职场文书
导游词之晋城蟒河
2019/12/12 职场文书
浅谈如何提高PHP代码质量之单元测试
2021/05/28 PHP
tp5使用layui实现多个图片上传(带附件选择)的方法实例
2021/11/17 PHP