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 相关文章推荐
javascript 写类方式之一
Jul 05 Javascript
div浮层,滚动条移动,位置保持不变的4种方法汇总
Dec 11 Javascript
javascript中parentNode,childNodes,children的应用详解
Dec 17 Javascript
为jquery的ajaxfileupload增加附加参数的方法
Mar 04 Javascript
js实现照片墙功能实例
Feb 05 Javascript
javascript实现连续赋值
Aug 10 Javascript
Jquery 垂直多级手风琴菜单附源码下载
Nov 17 Javascript
ES6的新特性概览
Mar 10 Javascript
Node.js 利用cheerio制作简单的网页爬虫示例
Mar 01 Javascript
Vue props 单向数据流的实现
Nov 06 Javascript
JsonProperty 的使用方法详解
Oct 11 Javascript
vue实现列表滚动的过渡动画
Jun 29 Javascript
基于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中get_object_vars()方法用法实例
2015/02/08 PHP
在WordPress中使用PHP脚本来判断访客来自什么国家
2015/12/10 PHP
PHP+MySQL实现消息队列的方法分析
2018/05/09 PHP
php模拟post提交请求调用接口示例解析
2020/08/07 PHP
JavaScript 事件记录使用说明
2009/10/20 Javascript
Firebug 字幕文件JSON地址获取代码
2009/10/28 Javascript
javascript 函数及作用域总结介绍
2013/11/12 Javascript
使用AngularJS编写较为优美的JavaScript代码指南
2015/06/19 Javascript
在Node.js应用中使用Redis的方法简介
2015/06/24 Javascript
jstree的简单实例
2016/12/01 Javascript
bootstrap模态框垂直居中效果
2016/12/03 Javascript
JS实现随机颜色的3种方法与颜色格式的转化
2017/01/05 Javascript
原生JS实现N级菜单的代码
2017/05/21 Javascript
vue.js中过滤器的使用教程
2017/06/08 Javascript
js实现rem自动匹配计算font-size的示例
2017/11/18 Javascript
vue webpack开发访问后台接口全局配置的方法
2018/09/18 Javascript
[jQuery] 事件和动画详解
2019/03/05 jQuery
微信小程序自定义多列选择器使用详解
2019/06/21 Javascript
vue-router跳转时打开新页面的两种方法
2019/07/29 Javascript
Vue路由管理器Vue-router的使用方法详解
2020/02/05 Javascript
Postman动态获取返回值过程详解
2020/06/30 Javascript
python中list循环语句用法实例
2014/11/10 Python
Python中设置变量作为默认值时容易遇到的错误
2015/04/03 Python
python修改操作系统时间的方法
2015/05/18 Python
使用url_helper简化Python中Django框架的url配置教程
2015/05/30 Python
selenium3+python3环境搭建教程图解
2018/12/07 Python
对Python3 goto 语句的使用方法详解
2019/02/16 Python
Python文件操作中进行字符串替换的方法(保存到新文件/当前文件)
2019/06/28 Python
Django框架自定义模型管理器与元选项用法分析
2019/07/22 Python
Python装饰器的应用场景代码总结
2020/04/10 Python
高分子材料与工程专业推荐信
2013/12/01 职场文书
机关保密承诺书
2014/06/03 职场文书
领导班子作风建设年个人整改措施
2014/09/29 职场文书
电力工程合作意向书
2015/05/11 职场文书
初中信息技术教学反思
2016/02/16 职场文书
Golang实现可重入锁的示例代码
2022/05/25 Golang