Angular项目中$scope.$apply()方法的使用详解


Posted in Javascript onJuly 26, 2017

前言

相信大家在一开始用angular做项目的时候,一定碰到过$scope.$apply()方法,表面上看,这像是一个帮助你进行数据更新的方法,那么,它为何存在,我们又该如何使用它呢。下面话不多说,来一起看看详细的介绍吧。

JavaScript执行顺序

JavaScript单线程操作,代码按照代码片段的顺序来之行,每个代码块从运行到结束都不会被打断,这也是为什么会发生浏览器阻塞的情况,往往是有一部分在运行,而导致其他所有的代码段冻结。

每当有耗费时间较多的任务出现,例如等待一个click事件,等待Ajax请求的回应,我们都会设定一个回调函数,当click事件被触发或者计时器完成,就会创建一个新的JavaScript turn,并执行完回调函数。

例如:

var button = document.getElementById('clickMe');

function buttonClicked () { 

 alert('the button was clicked'); 

 }

button.addEventListener('click', buttonClicked); 

 

function timerComplete () { 

 alert('timer complete'); 

}

setTimeout(timerComplete, 2000);

当JavaScript代码开始运行,先找到一个botton,并添加一个点击的监听事件,且设定一个timeout。浏览器会在这段代码执行完毕之后进行web的更新,并且接受用户的输入。

如果浏览器检测到一个新的点击事件发生,他就会开始一个turn,来执行buttonClicked函数。当函数执行结束,这个阶段也随之结束。

经过2000毫秒,浏览器会创建一个过程来执行timerComplete。在这两个过程之间,页面被重绘,输入被接收。

如何来更新绑定数据

Angular为我们提供了一些接口来绑定JavaScript代码与数据,Angular 采用任何数据可以用来绑定,并在JavaScript的末位运行并进行,并检查数据更新。

进行数据变化检查的实际上是$digest函数,但是通常我们不是直接使用$digest函数,而是使用$apply,$apply函数接收表达式或者函数作为参数后调用$digest来更新监控器。

那我们究竟要什么时候来调用$apply呢,实际上,Angular几乎在所有提供的代码中添加了$apply,如ng-click,初始controller,$http的回调操作,在这,你并不需要亲自调用 $apply,而且重复的调用会引起错误。

因此,当你运行了一个新阶段,并且这部分并不属于Angular库的情况下才需要使用$apply。这有一段关于setTimeout的代码,在经过了2000毫秒的延迟之后,代码进入执行了一个新的阶段,但是Angular并不知道数据有更新,因此更新并不会被显示。

function Ctrl($scope) { 

 $scope.message = "等2秒后进行更新";

 

 setTimeout(function () {

  $scope.message = "时间到";

  // AngularJS unaware of update to $scope

 }, 2000); 

}

为了方便大家的使用,Angular提供了$timeout来代替setTimeout,相当于在其中默认调用$apply。

如果在你的代码中使用了除$http之外的Ajax调用,除了ng-*之外的监听器,或者除了$timeout之外的计时器,都应该使用$scope.$apply来同步显示绑定。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
Javascript与vbscript数据共享
Jan 09 Javascript
IE浏览器PNG图片透明效果代码
Sep 02 Javascript
子窗口、父窗口和Silverlight之间的相互调用
Aug 16 Javascript
jquery图片延迟加载 前端开发技能必备系列
Jun 18 Javascript
如何在JavaScript中实现私有属性的写类方式(一)
Dec 04 Javascript
js清空form表单中的内容示例
May 20 Javascript
javascript格式化日期时间方法汇总
Jun 19 Javascript
JavaScript的jQuery库中ready方法的学习教程
Aug 14 Javascript
JavaScript知识点总结(十一)之js中的Object类详解
May 31 Javascript
微信小程序 wxapp内容组件 icon详细介绍
Oct 31 Javascript
jQuery选择器_动力节点Java学院整理
Jul 05 jQuery
javascript input输入框模糊提示功能的实现
Sep 25 Javascript
Vue中计算属性computed的示例解读
Jul 26 #Javascript
让你彻底掌握es6 Promise的八段代码
Jul 26 #Javascript
Bootstrap datepicker日期选择器插件使用详解
Jul 26 #Javascript
js实现图片轮播效果学习笔记
Jul 26 #Javascript
Angular4如何自定义首屏的加载动画详解
Jul 26 #Javascript
vue上传图片组件编写代码
Jul 26 #Javascript
深入讲解xhr(XMLHttpRequest)/jsonp请求之abort
Jul 26 #Javascript
You might like
PHP中返回引用类型的方法
2015/04/03 PHP
对于Laravel 5.5核心架构的深入理解
2018/02/22 PHP
PHP长连接实现与使用方法详解
2018/02/11 PHP
细说浏览器特性检测(2)-通用事件检测
2010/11/05 Javascript
浅谈关于JavaScript的语言特性分析
2013/04/11 Javascript
文字溢出实现溢出的部分再放入一个新生成的div中具体代码
2013/05/17 Javascript
JS关闭窗口与JS关闭页面的几种方法小结
2013/12/17 Javascript
判断window.onload是否多次使用的方法
2014/09/21 Javascript
完美解决jQuery 鼠标快速滑过后,会执行多次滑出的问题
2016/12/08 Javascript
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
2016/12/14 Javascript
jQuery Position方法使用和兼容性
2017/08/23 jQuery
浅谈vue-router 路由传参的方法
2017/12/27 Javascript
vue-cli 组件的导入与使用教程详解
2018/04/11 Javascript
一次Webpack配置文件的分离实战记录
2018/11/30 Javascript
微信小程序实现form表单本地储存数据
2019/06/27 Javascript
vue 指令和过滤器的基本使用(品牌管理案例)
2019/11/04 Javascript
记录一次websocket封装的过程
2020/11/23 Javascript
[03:00]2014DOTA2国际邀请赛 Titan淘汰潸然泪下Ohaiyo专访
2014/07/15 DOTA
Python正则表达式匹配HTML页面编码
2015/04/08 Python
Python 中pandas.read_excel详细介绍
2017/06/23 Python
numpy 进行数组拼接,分别在行和列上合并的实例
2018/05/08 Python
解决pandas中读取中文名称的csv文件报错的问题
2018/07/04 Python
Python 带有参数的装饰器实例代码详解
2018/12/06 Python
Django保护敏感信息的方法示例
2019/05/09 Python
python的sorted用法详解
2019/06/25 Python
python 中xpath爬虫实例详解
2019/08/26 Python
Python编写打字训练小程序
2019/09/26 Python
python使用pip安装SciPy、SymPy、matplotlib教程
2019/11/20 Python
Python进阶之迭代器与迭代器切片教程
2020/01/29 Python
Python实现SMTP邮件发送
2020/06/16 Python
Python生成并下载文件后端代码实例
2020/08/31 Python
使用CSS3的ruby-position固定注音位置的用法示例
2016/07/05 HTML / CSS
英国最大的天然和有机产品在线零售商之一:Big Green Smile
2020/05/06 全球购物
护理专科毕业推荐信
2013/11/10 职场文书
用React Native制作一个简单的游戏引擎
2021/05/27 Javascript
Zabbix对Kafka topic积压数据监控的问题(bug优化)
2022/07/07 Servers