AngularJS:应用的启动和执行过程

本文详细介绍了AngularJS应用的启动和执行过程。从浏览器加载HTML、解析DOM,到AngularJS初始化、编译服务创建及数据绑定,再到运行时的事件处理和数据模型更新,深入剖析了AngularJS的内部工作机制。同时,阐述了AngularJS如何通过$apply方法管理和协调JavaScript执行上下文,确保数据绑定和视图同步。

启动(startup):

<!doctype html>
<html ng-app>
  <head>
    <script src="http://code.angularjs.org/angular-1.1.0.min.js"></script>
  </head>
  <body>
    <p ng-init=" name='World' ">Hello {{name}}!</p>
  </body>
</html>
  • 1、浏览器载入HTML,然后把它解析成DOM树。
  • 2、浏览器载入angular.js脚本。
  • 3、AngularJS等到DOMContentLoaded事件触发执行。
  • 4、AngularJS寻找ng-app指令,这个指令指示了应用程序的边界。
  • 5、使用ng-app中指定的模块来配置注入器($injector)。
  • 6、注入器(injector)是用来创建“编译服务(injector)是用来创建“编译服务(injector)(compile service)”和“根作用域($rootScope)”的。
  • 7、编译服务(compileservice)是用来编译DOM树并把它链接到根作用域(compile service)是用来编译DOM树并把它链接到根作用域(compileservice)DOM(rootScope)的,这里的根作用域就是html。
  • 8、ng-init指令将“World”赋给作用域里的name这个变量。
  • 9、作用域中的name与页面上的{{name}}绑定,整个表达式变成了“Hello World”。

执行(runtime):

浏览器的事件机制:

  • 1、浏览器的Event loop等待事件的触发。所谓事件包括用户的交互操作、定时事件、或者网络事件(服务器的响应)。
  • 2、事件触发后,如果有绑定事件回调函数,那么此函数就会被执行。此时会进入Javascript上下文。通常回调用来修改DOM结构。
  • 3、一旦回调执行完毕,浏览器就会离开Javascript上下文,并且根据DOM的修改重新渲染视图。

而AngularJS通过使用自己的Event loop,改变了传统的Javascript工作流。这使得Javascript的执行被分成原生部分和拥有AngularJS执行上下文的部分。只有在AngularJS执行上下文中运行的操作,才能享受到AngularJS提供的数据绑定,异常处理,资源管理等功能和服务。你可以使用 apply()方法,从普通Javascript上下文进入AngularJS执行上下文。记住,大部分情况下(如在控制器,服务中),apply()方法,从普通Javascript上下文进入AngularJS执行上下文。记住,大部分情况下(如在控制器,服务中),apply()JavascriptAngularJSapply都已经被执行过了。只有当你使用自定义的事件回调或者是使用第三方类库的回调时,才需要自己执行$apply。

<!doctype html>
<html ng-app>
  <head>
    <script src="http://code.angularjs.org/angular-1.1.0.min.js"></script>
  </head>
  <body>
    <input ng-model="name">
    <p>Hello {{name}}!</p>
  </body>
</html> 

在编译阶段:
  input元素上的ng-model指令会给输入框绑定keydown事件;
  {{name}}这个变量替换表达式建立了一个 $watch ,来接受 name 变量改变的通知。
  
在执行期阶段:
  按下任何一个键(以X键为例),都会触发一个 input 输入框的keydown事件;
  input 上的指令捕捉到 input 内容的改变,然后调用 apply("name=′X′;")来更新处于AngularJS执行上下文中的模型;  AngularJS将name=′X′应用到模型上;  apply("name = 'X';")来更新处于AngularJS执行上下文中的模型;   AngularJS将 name='X'应用到模型上;   apply("name=X;")AngularJS  AngularJSname=X  digest 循环开始;这个循环是由两个小循环组成的,这两个小循环用来处理evalAsync队列和evalAsync队列和evalAsyncwatch列表。这个digest循环直到模型“稳定”前会一直迭代。这个稳定具体指的是digest循环直到模型“稳定”前会一直迭代。这个稳定具体指的是digestevalAsync列表为空,并且watch列表中检测不到任何改变了。这个watch列表中检测不到任何改变了。这个watchevalAsync队列是用来管理那些“视图渲染前需要在当前栈外执行的操作”。这通常使用 setTimeout(0)来完成的。并且,因为浏览器会根据事件队列按顺序渲染视图,这时还会造成视图的抖动。watch列表是一个表达式的集合,这些表达式可能是自上次迭代后发生了改变的。如果检测到了有改变,那么watch列表是一个表达式的集合,这些表达式可能是自上次迭代后发生了改变的。如果检测到了有改变,那么watchwatch函数就会被调用,它通常会把新的值更新到DOM中。

$watch 列表检测到了name值的变化,然后通知 {{name}}变量替换的表达式,这个表达式负责将DOM进行更新;
  AngularJS退出执行上下文,然后退出Javascript上下文中的keydown事件;
  浏览器以更新的文本重新渲染视图。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值