深入浅析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 相关文章推荐
javascript内存管理详细解析
Nov 11 Javascript
js定时器的使用(实例讲解)
Jan 06 Javascript
JS递归遍历对象获得Value值方法技巧
Jun 14 Javascript
修改Jquery Dialog 位置的实现方法
Aug 26 Javascript
原生JavaScript制作计算器
Oct 16 Javascript
JavaScript三种绑定事件方式及相互之间的区别分析
Jan 10 Javascript
通过学习bootstrop导航条学会修改bootstrop颜色基调
Jun 11 Javascript
基于LayUI分页和LayUI laypage分页的使用示例
Aug 02 Javascript
使用node.js对音视频文件加密的实例代码
Aug 30 Javascript
JavaScript实现单例模式实例分享
Dec 22 Javascript
React中如何引入Angular组件详解
Aug 09 Javascript
Smartour 让网页导览变得更简单(推荐)
Jul 19 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文件
2007/01/04 PHP
php生成文件
2007/01/15 PHP
php中rename函数用法分析
2014/11/15 PHP
visual studio code 调试php方法(图文详解)
2017/09/15 PHP
PHP使用zlib扩展实现GZIP压缩输出的方法详解
2018/04/09 PHP
js的闭包的一个示例说明
2008/11/18 Javascript
Firefox+FireBug使JQuery的学习更加轻松愉快
2010/01/01 Javascript
jquery中实现简单的tabs插件功能的代码
2011/03/02 Javascript
dojo学习第一天 Tab选项卡 实现
2011/08/28 Javascript
JS组件Bootstrap实现下拉菜单效果代码
2016/04/26 Javascript
AngularJS使用ng-repeat指令实现下拉框
2016/08/23 Javascript
javascript事件的传播基础实例讲解(35)
2017/02/14 Javascript
ES6新特性二:Iterator(遍历器)和for-of循环详解
2017/04/20 Javascript
iscroll实现下拉刷新功能
2017/07/18 Javascript
详解React-Native全球化多语言切换工具库react-native-i18n
2017/11/03 Javascript
web前端vue实现插值文本和输出原始html
2018/01/19 Javascript
小程序新版订阅消息模板消息
2019/12/31 Javascript
python切换hosts文件代码示例
2013/12/31 Python
在windows下快速搭建web.py开发框架方法
2016/04/22 Python
Python表示矩阵的方法分析
2017/05/26 Python
Python cookbook(数据结构与算法)根据字段将记录分组操作示例
2018/03/19 Python
pygame游戏之旅 游戏中添加显示文字
2018/11/20 Python
详解opencv Python特征检测及K-最近邻匹配
2019/01/21 Python
NumPy 基本切片和索引的具体使用方法
2019/04/24 Python
HTML5 CSS3实现一个精美VCD包装盒个性幻灯片案例
2014/06/16 HTML / CSS
北美主要的汽车零部件零售商:AutoShack.com
2019/02/23 全球购物
Dr. Martens马汀博士澳大利亚官网:马丁靴鼻祖
2019/07/02 全球购物
英国卫浴商店:Ergonomic Design
2019/09/22 全球购物
大学生职业生涯规划书汇总
2014/03/20 职场文书
篮球比赛拉拉队口号
2014/06/10 职场文书
2014年设计师工作总结
2014/11/25 职场文书
2014年班组建设工作总结
2014/12/01 职场文书
调任通知
2015/04/21 职场文书
升学宴祝酒词
2015/08/11 职场文书
Nginx四层负载均衡的配置指南
2021/06/11 Servers
浅谈@Value和@Bean的执行顺序问题
2021/06/16 Java/Android