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 相关文章推荐
JS获取IUSR_机器名和IWAM_机器名帐号的密码
Dec 06 Javascript
javascript 触发事件列表 比较不错
Sep 03 Javascript
Javascript 匿名函数及其代码模式原理
Mar 19 Javascript
div层的移动及性能优化
Nov 16 Javascript
弹出最简单的模式化遮罩层的js代码
Dec 04 Javascript
javascript 密码框防止用户粘贴和复制的实现代码
Feb 17 Javascript
js的[defer]和[async]属性
Nov 24 Javascript
JQuery动态添加和删除表格行的方法
Mar 09 Javascript
ZeroClipboard.js使用一个flash复制多个文本框
Jun 19 Javascript
解决JS内存泄露之js对象和dom对象互相引用问题
Jun 25 Javascript
详解Require.js与Sea.js的区别
Aug 05 Javascript
Vue插件打包与发布的方法示例
Aug 20 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实现的功能是显示8条基色色带
2006/10/09 PHP
PHP+Mysql日期时间如何转换(UNIX时间戳和格式化日期)
2012/07/15 PHP
基于PHP导出Excel的小经验 完美解决乱码问题
2013/06/10 PHP
php实现的返回数据格式化类实例
2014/09/22 PHP
PHP MPDF中文乱码的解决方式
2015/12/08 PHP
JavaScript国旗变换效果代码
2008/08/13 Javascript
动态样式类封装JS代码
2009/09/02 Javascript
基于jquery的一个OutlookBar类,动态创建导航条
2010/11/19 Javascript
仅IE支持clearAttributes/mergeAttributes方法使用介绍
2012/05/04 Javascript
改变隐藏的input中value的值代码
2013/12/30 Javascript
常用的几段javascript代码分享
2014/03/25 Javascript
jquery通过ajax加载一段文本内容的方法
2015/01/15 Javascript
JavaScript汉诺塔问题解决方法
2015/04/21 Javascript
jQuery仿360导航页图标拖动排序效果代码分享
2015/08/24 Javascript
JavaScript驾驭网页-DOM
2016/03/24 Javascript
Bootstrap开关(switch)控件学习笔记分享
2016/05/30 Javascript
利用Plupload.js解决大文件上传问题, 带进度条和背景遮罩层
2017/03/15 Javascript
nodejs+mongodb+vue前后台配置ueditor的示例代码
2018/01/02 NodeJs
layui之select的option叠加问题的解决方法
2018/03/08 Javascript
vue仿element实现分页器效果
2018/09/13 Javascript
layer插件实现在弹出层中弹出一警告提示并关闭弹出层的方法
2019/09/24 Javascript
[01:11:21]DOTA2-DPC中国联赛 正赛 VG vs Elephant BO3 第一场 3月6日
2021/03/11 DOTA
Python实现压缩和解压缩ZIP文件的方法分析
2017/09/28 Python
Python3多线程爬虫实例讲解代码
2018/01/05 Python
Python学习笔记之自定义函数用法详解
2019/06/08 Python
python实现猜拳游戏项目
2020/11/30 Python
彼得罗夫美国官网:Peter Thomas Roth美国(青瓜面膜)
2017/11/05 全球购物
莱德杯高尔夫欧洲官方商店:Ryder Cup Shop
2019/08/14 全球购物
澳大利亚顶级美发和美容贸易超市:glamaCo
2020/01/19 全球购物
blueseventy官网:铁人三项和比赛泳衣
2021/02/06 全球购物
如何通过 CSS 写出火焰效果
2021/03/24 HTML / CSS
动物学专业毕业生求职信
2013/10/11 职场文书
学习保证书怎么写
2015/02/26 职场文书
向雷锋同志学习倡议书
2015/04/27 职场文书
圣贤教育改变命运观后感
2015/06/16 职场文书
《游戏王:大师决斗》新活动上线 若无符合卡组可免费租用
2022/04/13 其他游戏