深入浅析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 相关文章推荐
JS实现在Repeater控件中创建可隐藏区域的代码
Sep 16 Javascript
解决3.01版的jquery.form.js中文乱码问题的解决方法
Mar 08 Javascript
jquery中的ajax方法怎样通过JSONP进行远程调用
May 04 Javascript
深入php面向对象、模式与实践
Feb 16 Javascript
jQuery表格插件datatables用法汇总
Mar 29 Javascript
JS模拟bootstrap下拉菜单效果实例
Jun 17 Javascript
原生JS实现图片懒加载(lazyload)实例
Jun 13 Javascript
js实现图片粘贴上传到服务器并展示的实例
Nov 08 Javascript
老生常谈JS中的继承及实现代码
Jul 06 Javascript
原生javascript制作贪吃蛇小游戏的方法分析
Feb 26 Javascript
JavaScript缺少insertAfter解决方案
Jul 03 Javascript
element多个表单校验的实现
May 27 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
Discuz 5.0 中读取纯真IP数据库函数分析
2007/03/16 PHP
使用PHPMyAdmin修复论坛数据库的图文方法
2012/01/09 PHP
PHP使用内置dir类实现目录遍历删除
2015/03/31 PHP
php获取本机真实IP地址实例代码
2016/03/31 PHP
刷新时清空文本框内容的js代码
2007/04/23 Javascript
js 点击页面其他地方关闭弹出层(示例代码)
2013/12/24 Javascript
js事件监听器用法实例详解
2015/06/01 Javascript
jquery 实现滚动条下拉时无限加载的简单实例
2016/06/01 Javascript
AngularJS控制器详解及示例代码
2016/08/16 Javascript
AngularJS服务service用法总结
2016/12/13 Javascript
详解MVC如何使用开源分页插件(shenniu.pager.js)
2016/12/16 Javascript
vue日期组件 支持vue1.0和2.0
2017/01/09 Javascript
nodejs连接mysql数据库简单封装示例-mysql模块
2017/04/10 NodeJs
微信小程序 滚动到某个位置添加class效果实现代码
2017/04/19 Javascript
Nuxt配合Node在实际生产中的应用详解
2018/08/07 Javascript
关于node-bindings无法在Electron中使用的解决办法
2018/12/18 Javascript
vue前端框架—Mint UI详解(更适用于移动端)
2019/04/30 Javascript
小程序封装路由文件和路由方法(5种全解析)
2019/05/26 Javascript
python实现mysql的单引号字符串过滤方法
2015/11/14 Python
横向对比分析Python解析XML的四种方式
2016/03/30 Python
windows 10下安装搭建django1.10.3和Apache2.4的方法
2017/04/05 Python
python利用requests库进行接口测试的方法详解
2018/07/06 Python
python 去除txt文本中的空格、数字、特定字母等方法
2018/07/24 Python
python 通过类中一个方法获取另一个方法变量的实例
2019/01/22 Python
Django使用unittest模块进行单元测试过程解析
2019/08/02 Python
django haystack实现全文检索的示例代码
2020/06/24 Python
Python 使用SFTP和FTP实现对服务器的文件下载功能
2020/12/17 Python
利用CSS3实现单选框动画特效示例代码
2016/09/26 HTML / CSS
阻止移动设备(手机、pad)浏览器双击放大网页的方法
2014/06/03 HTML / CSS
使用spring mvc+localResizeIMG实现HTML5端图片压缩上传的功能
2016/12/16 HTML / CSS
菲律宾酒店预订网站:Hotels.com菲律宾
2017/07/12 全球购物
武汉瑞得软件笔试题
2015/10/27 面试题
精神文明建设先进工作者事迹材料
2014/05/02 职场文书
小学国庆节活动方案策划书
2014/09/16 职场文书
店长岗位职责
2015/02/11 职场文书
工作汇报材料难写?方法都在这里了!
2019/07/01 职场文书