Angular的工作原理

    首先上一小段代码(index.html),结合代码我们来看看,angular一步一步都做了些什么。

复制代码
复制代码
<!doctype html>
<html ng-app><head><script src="angular.js"></script></head><body><png-init=" name='World' ">Hello {{name}}!</p></body> 
</html>
复制代码
复制代码

     当你用浏览器去访问index.html的时候,浏览器依次做了如下一些事情:

  1. 加载html,然后解析成DOM;
  2. 加载angular.js脚本;
  3. AngularJS等待DOMContentLoaded事件的触发;
  4. AngularJS寻找ng-app指令,根据这个指令确定应用程序的边界;
  5. 使用ng-app中指定的模块配置$injector;
  6. 使用$injector创建$compile服务和$rootScope;
  7. 使用$compile服务编译DOM并把它链接到$rootScope上;
  8. ng-init指令对scope里面的变量name进行赋值;
  9. 对表达式{{name}}进行替换,于是乎,显示为“Hello World!”     

  整个过程可以用这张图来表示:



     好了,通过上面的例子我们清楚了AngularJS是怎样一步一步渲染出一个页面的。那么它又是如何和浏览器的事件回路来交互的呢?或者说是如何跟用户来交互的呢?粗略来讲,主要分为三个阶段:
  1.  浏览器的事件回路一直等待着事件的触发,事件包括用户的交互操作、定时事件或者网络事件(如服务器的响应等);
  2.  一旦有事件触发,就会进入到Javascript的context中,一般通过回调函数来修改DOM;
  3.  等到回调函数执行完毕之后,浏览器又根据新的DOM来渲染新的页面。
     正如下面一张图所示,交互过程主要由几个循环组成:

     
     AngularJS修改了一般的Javascript工作流,并且提供了它自己的事件处理机制。这样就把Javascript的context分隔成两部分,一部分是原生的Javascript的context,另一部分是AngularJS的context。只有处在AngularJS的context中的操作才能享受到Angular的data-binding、exception handling、property watching等服务,但是对于外来者(如原生的Javascript操作、自定义的事件回调、第三方的库等)Angular也不是一概不接见,可以使用AngularJS提供的$apply()函数将这些外来者包进AngularJS的context中,让Angular感知到他们产生的变化。
     接下来,让我们一起来看看交互过程中的这几个循环是怎么工作的?
  1.  首先,浏览器会一直处于监听状态,一旦有事件被触发,就会被加到一个event queue中,event queue中的事件会一个一个的执行。
  2.  event queue中的事件如果是被$apply()包起来的话,就会进入到AngularJS的context中,这里的fn()是我们希望在AngularJS的context中执行的函数。
  3.  AngularJS将执行fn()函数,通常情况下,这个函数会改变应用的某些状态。
  4.  然后AngularJS会进入到由两个小循环组成的$digest循环中,一个循环是用来处理$evalAsync队列(用来schedule一些需要在渲染视图之前处理的操作,通常通过setTimeout(0)实现,速度会比较慢,可能会出现视图抖动的问题)的,一个循环是处理$watch列表(是一些表达式的集合,一旦有改变发生,那么$watch函数就会被调用)的。$digest循环会一直迭代知道$evalAsync队列为空并且$watch列表也为空的时候,即model不再有任何变化。
  5.  一旦AngularJS的$digest循环结束,整个执行就会离开AngularJS和Javascript的context,紧接着浏览器就会把数据改变后的视图重新渲染出来。

     接下来,我们还是结合代码来解析一下:

复制代码
复制代码
<!doctype html>
<html ng-app><head><script src="angular.js"></script></head><body><input ng-model="name"><p>Hello {{name}}!</p></body> 
</html>
复制代码
复制代码

     这段代码和上一段代码唯一的区别就是有了一个input来接收用户的输入。在用浏览器去访问这个html文件的时候,input上的ng-model指令会给input绑上keydown事件,并且会给name变量建议一个$watch来接收变量值改变的通知。在交互阶段主要会发生以下一系列事件:
  1.  当用户按下键盘上的某一个键的时候(比如说A),触发input上的keydown事件;
  2.  input上的指令察觉到input里值的变化,调用$apply(“name=‘A’”)更新处于AngularJS的context中的model;
  3.  AngularJS将’A’赋值给name;
  4.  $digest循环开始,$watch列表检测到name值的变化,然后通知{{name}}表达式,更新DOM;
  5.  退出AngularJS的context,然后退出Javascript的context中的keydown事件;
  6.  浏览器重新渲染视图。

转载于:https://www.cnblogs.com/moriah/p/6096998.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/270438.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络知识:四个网络命令ping、arp、tracert、route的用法介绍

网络相关的从业人员&#xff0c;都需要面对检测和解决网络故障的各种问题&#xff0c;实际案例中因为网络导致的故障也是最多的&#xff0c;今天我们和大家一起来学习一下解决网络故障时使用最多的四个网络命令。希望对大家以后的实际工作中的故障排除起到作用。 1、Ping命令的…

jQuery掷骰子

网上找的jQuery掷骰子效果&#xff0c;测试兼容IE7及以上浏览器&#xff0c;IE6没有测试 js代码如下&#xff1a; 1 $(function(){2 var dice $("#dice");3 dice.click(function(){4 $(".wrap").append("<div iddice_mask><…

电脑知识:台式电脑如何使用无线网上网

❤️作者主页&#xff1a;IT技术分享社区 ❤️作者简介&#xff1a;大家好,我是IT技术分享社区的博主&#xff0c;从事C#、Java开发九年&#xff0c;对数据库、C#、Java、前端、运维、电脑技巧等经验丰富。 ❤️个人荣誉&#xff1a; 数据库领域优质创作者&#x1f3c6;&#x…

电脑维修:如何给笔记本电脑升级内存条

❤️作者主页&#xff1a;IT技术分享社区 ❤️作者简介&#xff1a;大家好,我是IT技术分享社区的博主&#xff0c;从事C#、Java开发九年&#xff0c;对数据库、C#、Java、前端、运维、电脑技巧等经验丰富。 ❤️个人荣誉&#xff1a; 数据库领域优质创作者&#x1f3c6;&#x…

Object o = new Object()在内存中占几个字节

CAS&#xff1a; Compare and Swap&#xff0c;即比较再交换。 jdk5增加了并发包java.util.concurrent.*,其下面的类使用CAS算法实现了区别于synchronouse同步锁的一种乐观锁。JDK 5之前Java语言是靠synchronized关键字保证同步的&#xff0c;这是一种独占锁&#xff0c;也是…

MYSQL笔记:删除操作Delete、Truncate、Drop用法比较

今天小编给大家梳理一下MYSQL删除操作Delete、Truncate、Drop用法有什么区别&#xff0c;到底该如何合理使用&#xff0c;希望对大家能有帮助&#xff01;1、执行速度比较Delete、Truncate、Drop关键字都可以删除数据drop>truncate>delete2、原理方面2.1 deletedelete属于…

partition oracle用法,Oracle partition by 使用说明

--用法详解0、select * from wmg_test; ---测试数据1、select v1,v2,sum(v2) over(order by v2) as sum --按照 v2排序&#xff0c;累计nn-1....1from wmg_test;2、select v1,v2,sum(v2) over(partition by v1 order by v2) as sum --先分组&#xff0c;组内在进行…

SQLServer优化:SQLServer中NOLOCK关键字的用法介绍

目录 1、为什么SQLServer有NOLOCK关键字&#xff1f; 2、SQLServer有NOLOCK有什么问题 3、NOLOCK使用场景 4、nolock和with(nolock)的区别 5、表解锁脚本 1、为什么SQLServer有NOLOCK关键字&#xff1f; SQLServer没创建一个查询&#xff0c;都相当于创建一个查询会话&#xff…

20144303 20145239 实验三

20144303 20145239 实验三 实验内容 1、首先连接好实验箱电源&#xff0c;用串口线、并口线、网线、连接实验箱和主机 2、安装ADS并破解 安装文件在00-ads1.2目录下&#xff0c;破解方法在00-ads1.2\Crack目录下 3、安装GIVEIO驱动(安装文件在01-GIVEIO目录下) 把整个GIVEIO目录…

oracle无法创建监听器,关于Oracle net Manager中点击无法创建监听程序的解决方案

首先查看你的环境变量中是否有如果没有请添加该环境变量。变量名为&#xff1a;TNS_ADMIN 变量值为&#xff1a;E:\app\Administrator\product\11.2.0\dbhome_1\NETWORK\ADMIN;(如果你更改了默认目录&#xff0c;请找到相应的目录加进去)&#xff0c;添加完成之后&#xff0c;…

办公技巧:分享5个非常好用的Excel插件

❤️作者主页&#xff1a;IT技术分享社区 ❤️作者简介&#xff1a;大家好,我是IT技术分享社区的博主&#xff0c;从事C#、Java开发九年&#xff0c;对数据库、C#、Java、前端、运维、电脑技巧等经验丰富。 ❤️个人荣誉&#xff1a; 数据库领域优质创作者&#x1f3c6;&#x…

weblogic安全漫谈

今天&#xff0c;我来与大家探讨一下关于weblogic的话题 在进入内网后&#xff0c;如图&#xff1a; 当我们看到7001时&#xff0c;我们就可以测试weblogic反序列化漏洞&#xff0c;如图&#xff1a; 证明&#xff0c;漏洞存在&#xff0c;查看一下权限&#xff0c;如图&#x…

linux使进程不依赖终端,Linux nohup命令应用简介--让Linux的进程不受终端影响

nohup命令应用简介--让Linux的进程不受终端影响by:授客QQ&#xff1a;1033553122#开启ping进程[rootlocalhost ~]# pinglocalhost &[2] 4169[1]Terminatednohup ping localhost[rootlocalhost ~]# PINGlocalhost (127.0.0.1) 56(84) bytes of data.64 bytes from localhost…

电脑技巧:Win10操作系统设置定时开机图解教程

❤️作者主页&#xff1a;IT技术分享社区 ❤️作者简介&#xff1a;大家好,我是IT技术分享社区的博主&#xff0c;从事C#、Java开发九年&#xff0c;对数据库、C#、Java、前端、运维、电脑技巧等经验丰富。 ❤️个人荣誉&#xff1a; 数据库领域优质创作者&#x1f3c6;&#x…

网络技巧:想要WiFi信号满格,路由器应该这样放

现如今人手一部手机 不知不觉 WiFi也成了生活“必需品” 刷视频正入迷视频却突然卡顿 换个房间就收不到WiFi信号 如此令人抓狂的事情 生活中你一定遇到过 其实 这与路由器的错误摆放有很大关系 家庭无线路由器 放置在哪里信号最好&#xff1f; WiFi信号差如何解决&#xff1f; …

linux系统export,Linux入门进阶 - 如何在Linux中使用export命令

原标题&#xff1a;Linux入门进阶 - 如何在Linux中使用export命令来自&#xff1a; Linux迷链接&#xff1a;https://www.linuxmi.com/linux-export.htmlLinux export命令会标记哪些值需要传递给一组子进程。这是bash shell提供的一个简单但有用的特性。它允许管理员在不中断当…

Duilib开发环境搭建

1.到github上下载最新版本&#xff0c;https://github.com/duilib/duilib&#xff0c;也没有发现版本号&#xff0c;就如图所示吧 2.我只安装了VS2008&#xff0c;而github上的已经更新到VS2013了&#xff0c;所以要手动修改SIN工程文件 把sln文件打开&#xff0c;将最上面的2行…