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 构建一个xmlhttp对象池合理创建和使用xmlhttp对象
Jan 15 Javascript
js禁止页面复制功能禁用页面右键菜单示例代码
Aug 29 Javascript
微信JSSDK上传图片
Aug 23 Javascript
jQuery实现可关闭固定于底(顶)部的工具条菜单效果
Nov 06 Javascript
Bootstrap在线电子商务网站实战项目5
Oct 14 Javascript
详解如何在 vue 项目里正确地引用 jquery 和 jquery-ui的插件
Jun 01 jQuery
Angularjs的启动过程分析
Jul 18 Javascript
ng-repeat指令在迭代对象时的去重方法
Oct 02 Javascript
微信小程序实现联动选择器
Feb 15 Javascript
jQuery事件委托代码实践详解
Jun 21 jQuery
理解Proxy及使用Proxy实现vue数据双向绑定操作
Jul 18 Javascript
vscode+gulp轻松开发小程序的完整步骤
Oct 18 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
杏林同学录(六)
2006/10/09 PHP
PHP array_shift()用法实例分析
2019/01/07 PHP
PHP保存Base64图片base64_decode的问题整理
2019/11/04 PHP
Laravel框架Eloquent ORM修改数据操作示例
2019/12/03 PHP
javascript 事件处理程序介绍
2012/06/27 Javascript
JS替换字符串中字符即替换全部而不是第一个
2014/06/04 Javascript
轻松创建nodejs服务器(7):阻塞操作的实现
2014/12/18 NodeJs
jQuery大于号(>)选择器的作用解释
2015/01/13 Javascript
jQuery禁用键盘后退屏蔽F5刷新及禁用右键单击
2016/01/22 Javascript
JS+CSS实现闪烁字体效果代码
2016/04/05 Javascript
为什么JavaScript没有块级作用域
2016/05/22 Javascript
Angular表单验证实例详解
2016/10/20 Javascript
基于angular中的重要指令详解($eval,$parse和$compile)
2016/10/21 Javascript
微信小程序实现图片预加载组件
2017/01/18 Javascript
vue使用stompjs实现mqtt消息推送通知
2017/06/22 Javascript
BootStrap数据表格实例代码
2017/09/13 Javascript
JavaScript判断日期时间差的实例代码
2018/03/01 Javascript
vue多页面开发和打包正确处理方法
2018/04/20 Javascript
使用json-server简单完成CRUD模拟后台数据的方法
2018/07/12 Javascript
详解Vue源码学习之callHook钩子函数
2018/07/25 Javascript
[06:59]DOTA2-DPC中国联赛3月7日Recap集锦
2021/03/11 DOTA
Python中unittest模块做UT(单元测试)使用实例
2015/06/12 Python
python读取csv文件并把文件放入一个list中的实例讲解
2018/04/27 Python
selenium+python自动化测试之鼠标和键盘事件
2019/01/23 Python
三步实现Django Paginator分页的方法
2019/06/11 Python
Laravel框架表单验证格式化输出的方法
2019/09/25 Python
乌克兰时尚鞋子和衣服购物网站:Born2be
2018/05/24 全球购物
优秀村官事迹材料
2014/01/10 职场文书
银行简历自我评价
2014/02/11 职场文书
《童年的发现》教学反思
2014/02/14 职场文书
企业优秀团员事迹材料
2014/08/20 职场文书
杭白菊导游词
2015/02/10 职场文书
2015年采购工作总结
2015/04/10 职场文书
业余无线电通联Q语
2022/02/18 无线电
JAVA长虹键法之建造者Builder模式实现
2022/04/10 Java/Android
微信小程序 WeUI扩展组件库的入门教程
2022/04/21 Javascript