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 相关文章推荐
可插入图片的TEXT文本框
Dec 27 Javascript
利用jquery实现下拉框的禁用与启用
Dec 07 Javascript
javascript动画系列之模拟滚动条
Dec 13 Javascript
JS判断鼠标进入容器的方向与window.open新窗口被拦截的问题
Dec 23 Javascript
jQuery图片轮播功能实例代码
Jan 29 Javascript
canvas绘制多边形
Feb 24 Javascript
AngularJS实时获取并显示密码的方法
Feb 06 Javascript
JS中双击和单击事件冲突的解决方法
Apr 09 Javascript
详解基于mpvue的小程序markdown适配解决方案
May 08 Javascript
浅谈在node.js进入文件目录的问题
May 13 Javascript
vue+mousemove实现鼠标拖动功能(拖动过快失效问题解决方法)
Aug 24 Javascript
vue+axios 拦截器实现统一token的案例
Sep 11 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设计模式 Interpreter(解释器模式)
2011/06/26 PHP
PHP中你应该知道的require()文件包含的正确用法
2015/06/12 PHP
PHP重定向与伪静态区别
2017/02/19 PHP
Laravel核心解读之异常处理的实践过程
2019/02/24 PHP
JavaScript高级程序设计阅读笔记(六) ECMAScript中的运算符(二)
2012/02/27 Javascript
jQuery.each()用法分享
2012/07/31 Javascript
javascript制作坦克大战全纪录(1)
2014/11/27 Javascript
JS获取图片高度宽度的方法分享
2015/04/17 Javascript
使用javaScript动态加载Js文件和Css文件
2015/10/24 Javascript
基于jquery实现无限级树形菜单
2016/03/22 Javascript
nodeJs爬虫获取数据简单实现代码
2016/03/29 NodeJs
简单理解js的冒泡排序
2016/12/19 Javascript
快速掌握jQuery插件开发
2017/01/19 Javascript
在javascript中,null>=0 为真,null==0却为假,null的值详解
2017/02/22 Javascript
js传递数组参数到后台controller的方法
2018/03/29 Javascript
JavaScript 作用域scope简单汇总
2019/10/23 Javascript
详解Python list 与 NumPy.ndarry 切片之间的对比
2017/07/24 Python
Python任意字符串转16, 32, 64进制的方法
2019/06/12 Python
python opencv 二值化 计算白色像素点的实例
2019/07/03 Python
python list多级排序知识点总结
2019/10/23 Python
python批量替换文件名中的共同字符实例
2020/03/05 Python
TensorFlow中如何确定张量的形状实例
2020/06/23 Python
PyQt5结合matplotlib绘图的实现示例
2020/09/15 Python
python中threading和queue库实现多线程编程
2021/02/06 Python
python爬虫线程池案例详解(梨视频短视频爬取)
2021/02/20 Python
HTML5语义化元素你真的用对了吗
2019/08/22 HTML / CSS
大一军训感言
2014/01/09 职场文书
2015年幼儿园毕业感言
2014/02/12 职场文书
《藤野先生》教学反思
2014/02/19 职场文书
2014学雷锋活动心得体会
2014/03/10 职场文书
演讲稿开场白台词
2014/08/25 职场文书
小学毕业典礼演讲稿
2014/09/09 职场文书
推广普通话共筑中国梦演讲稿
2014/09/21 职场文书
2014年小学教学工作总结
2014/11/13 职场文书
2014年村党支部工作总结
2014/12/04 职场文书
推广普通话宣传标语口号
2015/12/26 职场文书