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不间断向上滚动效果代码
Dec 25 Javascript
jQuery使用之设置元素样式用法实例
Jan 19 Javascript
浅谈jquery回调函数callback的使用
Jan 30 Javascript
如何用javascript计算文本框还能输入多少个字符
Jul 29 Javascript
基于jquery编写的放大镜插件
Mar 23 Javascript
AngularJs Javascript MVC 框架
Jun 20 Javascript
对js eval()函数的一些见解
Aug 15 Javascript
AngularJS表达式讲解及示例代码
Aug 16 Javascript
Vue 项目代理设置的优化
Apr 17 Javascript
Electron autoUpdater实现Windows安装包自动更新的方法
Dec 24 Javascript
解决layui表格内文本超出隐藏的问题
Sep 12 Javascript
在vue中封装方法以及多处引用该方法详解
Aug 14 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
phpMyAdmin下载、安装和使用入门教程
2007/05/31 PHP
php中截取中文字符串的代码小结
2011/07/17 PHP
php curl请求信息和返回信息设置代码实例
2015/04/27 PHP
jQuery 1.2.x 升? 1.3.x 注意事项
2009/05/06 Javascript
javascript 面向对象全新理练之数据的封装
2009/12/03 Javascript
js更优雅的兼容
2010/08/12 Javascript
javascript教程之不完整的继承(js原型链)
2014/01/13 Javascript
jQuery.ajax实现根据不同的Content-Type做出不同的响应
2016/11/03 Javascript
详谈ES6中的迭代器(Iterator)和生成器(Generator)
2017/07/31 Javascript
swiper动态改变滑动内容的实现方法
2018/01/17 Javascript
微信小程序实现折叠面板
2018/01/31 Javascript
jQuery实现的鼠标响应缓冲动画效果示例
2018/02/13 jQuery
微信小程序实现留言板(Storage)
2018/11/02 Javascript
详解为生产环境编译Angular2应用的方法
2018/12/10 Javascript
前端深入理解Typescript泛型概念
2020/03/09 Javascript
vue中移动端调取本地的复制的文本方式
2020/07/18 Javascript
Python multiprocessing.Manager介绍和实例(进程间共享数据)
2014/11/21 Python
Hadoop中的Python框架的使用指南
2015/04/22 Python
python实现查找两个字符串中相同字符并输出的方法
2015/07/11 Python
简单解析Django框架中的表单验证
2015/07/17 Python
python中文分词教程之前向最大正向匹配算法详解
2017/11/02 Python
Python定时任务sched模块用法示例
2018/07/16 Python
Python图像处理之图像的缩放、旋转与翻转实现方法示例
2019/01/04 Python
django 信号调度机制详解
2019/07/19 Python
python使用pymongo与MongoDB基本交互操作示例
2020/04/09 Python
Python读写压缩文件的方法
2020/07/30 Python
一款纯css3实现的颜色渐变按钮的代码教程
2014/11/12 HTML / CSS
使用layui框架实现点击左侧导航切换右侧内容且右侧选项卡跟随变化的效果
2020/11/10 HTML / CSS
购买限量版收藏品、珠宝和礼品:Bradford Exchange
2016/09/23 全球购物
日本乐天德国站:Rakuten.de
2019/05/16 全球购物
Ramy Brook官网:美国现代女装品牌
2019/06/18 全球购物
向全球直邮输送天然健康产品:iHerb.com
2020/05/03 全球购物
24岁生日感言
2014/01/13 职场文书
校长师德表现自我评价
2015/03/04 职场文书
小学见习报告
2015/06/23 职场文书
市级三好生竞选稿
2015/11/21 职场文书