深入浅析AngularJS中的一次性数据绑定 (bindonce)


Posted in Javascript onMay 11, 2017

一、理解双向数据绑定和监听器

为了实现双向数据绑定,AngularJS使用了$watch API来观察期作用域中的模型变化。具体的作用域取决于你的代码如何编写。如果你没有创建一个自作用域,就是说没有使用ngController指令在你的DOM和你的控制器代码之间创建一个关联,你可能处理的是跟作用域$rootScope,这个作用域由ngApp自动创建,并且是应用中所有作用域的父作用域,当然,如果你选择手动启动AngularJS,那情况就另当别论了。每当你创建了一个数据绑定时,AngularJS就会自动创建一个监听器来监听这个数据的变化。比如说下面这个简单的例子:

<p>Hello {{name}}!</p>

在这个例子中,我们使用了插值指令,这个指令会注册一个监听器来监听相应作用域中属性name的变化,并在该属性发生变化时将它实时反应到DOM中。

添加下面的代码,你的name属性将会自动的被赋值为Pascal:

angular.module('myApp', []) 
 .run(function ($rootScope) { 
  $rootScope.name = "Pascal"; 
}]);

 通过上面的代码,我们就成功的使用了插值指令创建了在试图上创建了一个数据绑定。现在,如果name属性发生变化,视图将会自动发生更新。比如说我们添加下面的代码,在按钮点击是修改name的值:

<button ng-click="name = 'Christoph'">Click me!</button>

  此时,点击按钮,我们可以将name的值修改为Christoph,同时我们会触发一个$digest循环来更新DOM中相应的部分。在上面的例子中,你看的知识单向数据绑定。然而,你完全可以使用ngModel指令来将视图中发生的变化实时的反应到模型中。

上面的双向绑定魔法的实现完全依赖于$digest循环,当$digest循环被触发时,AngularJS将会去处理遍历当前作用域和子作用域中的所有监听器,然后通过检查模型中发生的变化来更新DOM中的值,直到模型不再发生变化为止。一旦$digest循环执行完成,浏览器会重新渲染DOM来反应模型数据变化。

 现在,我们大概了解了AngularJS的数据绑定机制,你可能会问我们为何还需要一次性数据绑定。

由于AngularJS使用监听器来实现数据绑定。当监听器越来越多时,可能会出现一些性能上的问题。由于在注册监听器使,同时会注册一个回调函数,以便在$digest循环执行时能够相应的更新视图。也就是说,监听器越多,AngularJS需要处理的回调函数也就越多。

现在假设在视图中有很多值需要被AngularJS处理。比如说像上面使用插值指令来进行数据绑定,虽然我们可能并不想让这个值只绑定一次,比如说上面的Pascal,在应用代码执行的整个过程中这个属性都不会发生改变,但是AngularJS默认依然会在这个属性上绑定一个监听器和回调函数。因此,在$digest时,AngularJS依然会去特意的关注这个值,这实在是有些过头了。

二、一次性数据绑定(One-time bindings)

这就是我们需要一次性数据绑定的原因。在AngularJS的文档中,我们可以清楚的了解到这个新特性的作用:一次性数据绑定表达式可以在数据稳定之后,不需要在$digest循环中重计算…

一次性数据绑定的出现解决了前面提到的由监听器太多带来的性能问题。那么我们应该如何使用一次性数据绑定呢?

使用一次性数据绑定非常的简单,我们只需要在表达式之前加上双冒号::即可。比如,前面我们使用了插值指令将name属性绑定到了视图中:

<p>Hello {{name}}!</p>

使用一次性数据绑定,我们这样写:

<p>Hello {{::name}}!</p>

在AngularJS 1.3版本中,你可以在任何AngularJS的表达式中使用一次性数据绑定。即使在诸如ng-repeat这样严重依赖于双向绑定的指令中,你依然可以使用它。

以上所述是小编给大家介绍的AngularJS中的一次性数据绑定 (bindonce),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
基于jquery实现的一个选择中国大学的弹框 (数据、步骤、代码)
Jul 26 Javascript
7款风格新颖的jQuery/CSS3菜单导航分享
Apr 23 Javascript
Jquery读取URL参数小例子
Aug 30 Javascript
js实现的彩色方块飞舞奇幻效果
Jan 27 Javascript
AngularJS 与百度地图的结合实例
Oct 20 Javascript
Bootstrap和Java分页实例第二篇
Dec 23 Javascript
基于 flexible 的 Vue 组件:Toast -- 显示框效果
Dec 26 Javascript
解决vue2.0路由跳转未匹配相应用路由避免出现空白页面的问题
Aug 24 Javascript
vue多级复杂列表展开/折叠及全选/分组全选实现
Nov 05 Javascript
vue-cli3 karma单元测试的实现
Jan 18 Javascript
详解小程序如何避免多次点击,重复触发事件
Apr 08 Javascript
JS原生瀑布流效果实现
Apr 26 Javascript
BootStrap 获得轮播中的索引和当前活动的焦点对象
May 11 #Javascript
微信小程序 navbar实例详解
May 11 #Javascript
微信小程序 图片宽高自适应详解
May 11 #Javascript
bootstrap fileinput组件整合Springmvc上传图片到本地磁盘
May 11 #Javascript
微信小程序 刷新上拉下拉不会断详细介绍
May 11 #Javascript
微信小程序图片选择、上传到服务器、预览(PHP)实现实例
May 11 #Javascript
微信小程序 setData使用方法及常用错误解决办法
May 11 #Javascript
You might like
从php核心代码分析require和include的区别
2011/01/02 PHP
jQuery的学习步骤
2011/02/23 Javascript
更优雅的事件触发兼容
2011/10/24 Javascript
js购物车实现思路及代码(个人感觉不错)
2013/12/23 Javascript
ExpressJS入门实例
2015/01/14 Javascript
JavaScript如何自定义trim方法
2015/07/28 Javascript
高性能JavaScript 重排与重绘(2)
2015/08/11 Javascript
java必学必会之static关键字
2015/12/03 Javascript
关于Jquery中的bind(),on()绑定事件方式总结
2016/10/26 Javascript
JS实用的带停顿的逐行文本循环滚动效果实例
2016/11/23 Javascript
jQuery页面弹出框实现文件上传
2017/02/09 Javascript
如何写好你的JavaScript【推荐】
2017/03/02 Javascript
VUE 3D轮播图封装实现方法
2018/07/03 Javascript
vue-cli项目无法用本机IP访问的解决方法
2018/09/20 Javascript
发布Angular应用至生产环境的方法
2018/12/10 Javascript
玩转Koa之koa-router原理解析
2018/12/29 Javascript
Vue watch响应数据实现方法解析
2020/07/10 Javascript
vue-router重写push方法,解决相同路径跳转报错问题
2020/08/07 Javascript
pymssql ntext字段调用问题解决方法
2008/12/17 Python
在Python的setuptools框架下生成egg的教程
2015/04/13 Python
python实现矩阵乘法的方法
2015/06/28 Python
python dataframe 输出结果整行显示的方法
2018/06/14 Python
python2使用bs4爬取腾讯社招过程解析
2019/08/14 Python
Python实现像awk一样分割字符串
2020/09/15 Python
详解numpy.ndarray.reshape()函数的参数问题
2020/10/13 Python
Python 爬虫批量爬取网页图片保存到本地的实现代码
2020/12/24 Python
What is view? why do we have view?
2012/06/22 面试题
送给程序员的20个Java集合面试问题
2014/08/06 面试题
应届生如何写自荐信
2014/01/05 职场文书
学校先进集体事迹材料
2014/05/31 职场文书
教室标语大全
2014/06/21 职场文书
优秀教研组申报材料
2014/12/26 职场文书
培训师岗位职责
2015/02/14 职场文书
2019最新校园运动会广播稿!
2019/06/28 职场文书
励志语录:你若不勇敢,谁替你坚强
2019/11/08 职场文书
Mysql的Table doesn't exist问题及解决
2022/12/24 MySQL