Angular数据绑定机制原理


Posted in Javascript onApril 17, 2018

1.Angular.js扩展浏览器的事件循环

浏览器持续等待例如用户交互这样的事件。当你在一个<input>标签里输入字符之后,这个事件的回调函数在JS解释器中执行了其包含的DOM操作,执行完毕后,浏览器响应地对DOM做出了变化。Angular拓展了这个事件循环,使它有时候成为angular context 的执行环境。

2.$watch list

$watch 可以检测model的变化。每当绑定一个数据到view上的时候,$watch队列就会插入一条对应的$watch。例子如下:

controller.js:

app.controller('MainCtrl', function($scope) {
 $scope.people = [...]; // 假设长度为10
});

index.html:

<ul>
 <li ng-repeat="person in people">
   {{person.name}} - {{person.age}}
 </li>
</ul>

其中ng-repeat 生成了一个1个$watch,每个person生成了2个$watch,总共是(1+2*10),21个$watch。$watch的生成阶段是模板加载完成,也就是linking阶段。(angular分为compile和linking阶段),Angular会寻找每个directive(上面的例子中ng-repeat和{{}}都属于directive),然后生成每个$watch。

3.$digest 循环

当浏览器接收到angular context相关的事件时,$digest循环就会被触发。它由2个小循环组成,1个处理evalAsync 队列,另一个处理$watch队列。$digest进行循环时,将遍历$watch队列,查看是否有数据更新过,这种遍历就叫做dirty-checkin(脏检查),如果脏检查发现有$watch更新,将会触发新的脏检查,直到所有的$watch都没有更新。这样就能保证每个model都不会变化。

脏检查超过10次后会抛出异常防止无限循环。$digest循环结束后DOM会相应地发生变化。其实$digest从字面意义理解就像“消化”的过程一样,逐渐地把所有营养($watch的变化)都吸收掉。

4.通过$apply 进入 angular context

$apply 决定事件是否进入angular context,使用angualr的自带directive,比如ng-model,更改绑定的数据时,angular会将事件封装到$apply中。比如,ng-model="name"的输入框,输入字符“w”,事件会调用,$apply("name='w';"),完成$scope中的数据更新。

调用第三方库时的数据绑定

当在angular中调用jquery,并不能更新jquery绑定的数据,因为jquery没有调用$apply,事件没有进入angular context,导致$digest没有执行。例子如下:

app.js

app.directive('clickable', function() {
  return {
   restrict: "E",
   scope: {
    count1: '=',
    count2: '='
   },
   template: '<ul style="background-color: lightblue"><li>{{count1}}</li><li>{{count2}}</li></ul>',
   link: function(scope, element, attrs) {
    element.bind('click', function() {
     scope.count1++;
     scope.count2++;
    });
   }
  }
});
app.controller('MainCtrl', function($scope) {
 $scope.count1= 0;
 $scope.count2= 0;
});

例子中,每次点击该元素,预期count1和count2都会自增1,但实际没有。其实$scope(ViewModel)已经改变,但是没有强制执行$digest。修改click事件如下:

element.bind('click', function() {
 scope.$apply(function() {
   scope.foo++;
   scope.bar++;
 });
})

经过调用$apply实现了预期。

5.总结

angular事件绑定机制如下图:

Angular数据绑定机制原理

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jQuery提示效果代码分享
Nov 20 Javascript
jQuery查找节点方法完整实例
Sep 13 Javascript
文件上传的几个示例分享【推荐】
Dec 16 Javascript
Node.js数据库操作之查询MySQL数据库(二)
Mar 04 Javascript
javascript数据结构中栈的应用之符号平衡问题
Apr 11 Javascript
ajax请求data遇到的问题分析
Jan 18 Javascript
浅谈用Webpack路径压缩图片上传尺寸获取的问题
Feb 22 Javascript
快速解决vue动态绑定多个class的官方实例语法无效的问题
Sep 05 Javascript
在layui中select更改后生效的方法
Sep 05 Javascript
uni-app实现点赞评论功能
Nov 25 Javascript
让你30分钟快速掌握vue3教程
Oct 26 Javascript
Vue Element plus使用方法梳理
Dec 24 Vue.js
基于vue-ssr的静态网站生成器VuePress 初体验
Apr 17 #Javascript
jQuery实现使用sort方法对json数据排序的方法
Apr 17 #jQuery
jQuery+datatables插件实现ajax加载数据与增删改查功能示例
Apr 17 #jQuery
jQuery实现带右侧索引功能的通讯录示例【附源码下载】
Apr 17 #jQuery
Angular 容器部署的方法
Apr 17 #Javascript
bootstrap中日历范围选择插件daterangepicker的使用详解
Apr 17 #Javascript
jQuery简单判断值是否存在于数组中的方法示例
Apr 17 #jQuery
You might like
PHP脚本的10个技巧(5)
2006/10/09 PHP
CodeIgniter使用phpcms模板引擎
2013/11/12 PHP
smarty中英文多编码字符截取乱码问题解决方法
2014/10/28 PHP
php根据日期显示所在星座的方法
2015/07/13 PHP
php简单统计中文个数的方法
2016/09/30 PHP
利用JQuery为搜索栏增加tag提示
2009/06/22 Javascript
javascript demo 基本技巧
2009/12/18 Javascript
ASP中Sub和Function的区别说明
2020/08/30 Javascript
通过JS自动隐藏手机浏览器的地址栏实现原理与代码
2013/01/02 Javascript
JavaScript实现标题栏文字轮播效果代码
2015/10/24 Javascript
浅析Nodejs npm常用命令
2016/06/14 NodeJs
JavaScript获取键盘按键的键码(参照表)
2017/01/10 Javascript
Bootstrap输入框组件使用详解
2017/06/09 Javascript
JavaScript操作文件_动力节点Java学院整理
2017/06/30 Javascript
解决vue2.x中数据渲染以及vuex缓存的问题
2017/07/13 Javascript
vue计算属性和监听器实例解析
2018/05/10 Javascript
Node.js使用Angular简单示例
2018/05/11 Javascript
用npm安装vue和vue-cli,并使用webpack创建项目的方法
2018/09/28 Javascript
解决elementUI 切换tab后 el_table 固定列下方多了一条线问题
2020/07/19 Javascript
[53:52]OG vs EG 2018国际邀请赛淘汰赛BO3 第二场 8.23
2018/08/24 DOTA
python爬虫入门教程之糗百图片爬虫代码分享
2014/09/02 Python
Python全排列操作实例分析
2018/07/24 Python
Python SQL查询并生成json文件操作示例
2018/08/17 Python
Python基于OpenCV实现人脸检测并保存
2019/07/23 Python
django 微信网页授权登陆的实现
2019/07/30 Python
Python实现自动访问网页的例子
2020/02/21 Python
python正则表达式实例代码
2020/03/03 Python
Jogun Shop中文官网:韩国知名时尚男装网站
2016/10/12 全球购物
Elemis美国官网:英国的第一豪华护肤品牌
2018/03/15 全球购物
幼儿教师国培感言
2014/02/19 职场文书
勤俭节约倡议书
2014/04/14 职场文书
认购协议书范本
2014/04/22 职场文书
党的群众路线教育实践活动查摆剖析材料
2014/10/10 职场文书
领导个人查摆剖析材料
2014/10/29 职场文书
离婚协议书范本
2015/01/26 职场文书
MySQL 亿级数据导入导出及迁移笔记
2021/06/18 MySQL