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 相关文章推荐
javascript操作JSON的要领总结
Dec 09 Javascript
JavaScript闭包函数访问外部变量的方法
Aug 27 Javascript
js获取微信版本号的方法
May 12 Javascript
jQuery实现仿微软首页感应鼠标变化滑动窗口效果
Oct 08 Javascript
AngularJS中如何使用$parse或$eval在运行时对Scope变量赋值
Jan 25 Javascript
js实现可控制左右方向的无缝滚动效果
May 29 Javascript
JS字符串false转boolean的方法(推荐)
Mar 08 Javascript
IntersectionObserver实现图片懒加载的示例
Sep 29 Javascript
基于Two.js实现星球环绕动画效果的示例
Nov 06 Javascript
cordova入门基础教程及使用中遇到的一些问题总结
Nov 14 Javascript
vue双向绑定及观察者模式详解
Mar 19 Javascript
简单学习5种处理Vue.js异常的方法
Jun 17 Javascript
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
菜鸟学PHP之Smarty入门
2007/01/04 PHP
几种有用的变型 PHP中循环语句的用法介绍
2012/01/30 PHP
浅析Mysql 数据回滚错误的解决方法
2013/08/05 PHP
php微信开发之自定义菜单完整流程
2016/10/08 PHP
PHP数据库操作二:memcache用法分析
2017/08/16 PHP
Laravel中encrypt和decrypt的实现方法
2017/09/24 PHP
Javascript实例教程(19) 使用HoTMetal(1)
2006/12/23 Javascript
script的async属性以非阻塞的模式加载脚本
2013/01/15 Javascript
js 距离某一时间点时间是多少实现代码
2013/10/14 Javascript
Javascript玩转继承(三)
2014/05/08 Javascript
jQuery表单美化插件jqTransform使用详解
2015/04/12 Javascript
动态生成的DOM不会触发onclick事件的原因及解决方法
2016/08/06 Javascript
前端构建工具之gulp的语法教程
2017/06/12 Javascript
ES6 javascript中Class类继承用法实例详解
2017/10/30 Javascript
微信小程序实现分享到朋友圈功能
2018/07/19 Javascript
对Vue beforeRouteEnter 的next执行时机详解
2018/08/25 Javascript
用Angular实现一个扫雷的游戏示例
2020/05/15 Javascript
JS实现数据动态渲染的竖向步骤条
2020/06/24 Javascript
jQuery实现日历效果
2020/09/11 jQuery
[02:43]DOTA2英雄基础教程 圣堂刺客
2013/12/09 DOTA
[56:38]DOTA2-DPC中国联赛正赛Aster vs Magma BO3 第一场 3月5日
2021/03/11 DOTA
使用pygame模块编写贪吃蛇的实例讲解
2018/02/05 Python
详解Django rest_framework实现RESTful API
2018/05/24 Python
python 通过手机号识别出对应的微信性别(实例代码)
2019/12/22 Python
分厂厂长岗位职责
2013/12/29 职场文书
教师节商场活动方案
2014/02/13 职场文书
户外活动总结范文
2014/04/30 职场文书
教师竞聘上岗演讲稿
2014/09/03 职场文书
涉外离婚协议书怎么写
2014/11/20 职场文书
公司介绍信范文
2015/01/31 职场文书
2015年生产车间工作总结
2015/04/22 职场文书
2015年基建工作总结范文
2015/05/23 职场文书
拉贝日记观后感
2015/06/05 职场文书
在校学生证明格式
2015/06/24 职场文书
阿里云Nginx配置https实现域名访问项目(图文教程)
2021/03/31 Servers
vue实现拖拽交换位置
2022/04/07 Vue.js