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实现兼容IE6与IE7的DIV高度
May 13 Javascript
jquery div 居中技巧应用介绍
Nov 24 Javascript
javascript比较两个日期的先后示例代码
Dec 31 Javascript
基于JavaScript实现Json数据根据某个字段进行排序
Nov 24 Javascript
JS操作XML实例总结(加载与解析XML文件、字符串)
Dec 08 Javascript
jQuery validate+artdialog+jquery form实现弹出表单思路详解
Apr 18 Javascript
浅析函数声明和函数表达式——函数声明的声明提前
May 03 Javascript
js中利用cookie实现记住密码功能
Aug 20 Javascript
关于 jQuery Easyui异步加载tree的问题解析
Dec 06 Javascript
RequireJs的使用详解
Feb 19 Javascript
9种使用Chrome Firefox 自带调试工具调试javascript技巧
Dec 22 Javascript
在vue项目中 实现定义全局变量 全局函数操作
Oct 26 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 $_SERVER详解
2009/01/16 PHP
php array_filter除去数组中的空字符元素
2020/06/21 PHP
PHP 第二节 数据类型之数值型
2012/04/28 PHP
基于preg_match_all采集后数据处理的一点心得笔记(编码转换和正则匹配)
2014/01/31 PHP
PHP性能分析工具xhprof的安装使用与注意事项
2017/12/19 PHP
PHP之header函数详解
2021/03/02 PHP
php析构函数的具体用法小结
2014/03/11 Javascript
jQuery中each()方法用法实例
2014/12/27 Javascript
JS实现仿Windows7风格的网页右键菜单效果代码
2015/09/11 Javascript
Vuejs第十篇之vuejs父子组件通信
2016/09/06 Javascript
JavaScript实现兼容IE6的收起折叠与展开效果实例
2017/09/20 Javascript
Vue2.0+ElementUI实现表格翻页的实例
2017/10/23 Javascript
C#实现将一个字符转换为整数
2017/12/12 Javascript
jQuery插件实现弹性运动完整示例
2018/07/07 jQuery
JS通过ajax + 多列布局 + 自动加载实现瀑布流效果
2019/05/30 Javascript
vue+mock.js实现前后端分离
2019/07/24 Javascript
跟老齐学Python之关于循环的小伎俩
2014/10/02 Python
21行Python代码实现拼写检查器
2016/01/25 Python
用python实现百度翻译的示例代码
2018/03/09 Python
python 3.7.0 下pillow安装方法
2018/08/27 Python
Python TestSuite生成测试报告过程解析
2020/07/23 Python
3分钟看懂Python后端必须知道的Django的信号机制
2020/07/26 Python
selenium设置浏览器为headless无头模式(Chrome和Firefox)
2021/01/08 Python
Nike香港官网:Nike HK
2019/03/23 全球购物
美国时尚假发购物网站:Wigsbuy
2019/04/06 全球购物
欧洲最古老的鞋厂:Peter Kaiser
2019/11/05 全球购物
Michael Kors香港官网:美国奢侈品品牌
2019/12/26 全球购物
MySQL面试题
2014/01/12 面试题
自动化工程专业个人应聘自荐信
2013/09/26 职场文书
2015年感恩父亲节演讲稿
2015/03/19 职场文书
二胎满月酒致辞
2015/07/29 职场文书
Python列表删除重复元素与图像相似度判断及删除实例代码
2021/05/07 Python
python爬虫之selenium库的安装及使用教程
2021/05/23 Python
html+css实现滚动到元素位置显示加载动画效果
2021/08/02 HTML / CSS
centos8安装nginx1.9.1的详细过程
2021/08/02 Servers
引用计数法和root搜索算法以及JVM中判定对象需要回收的方法
2022/04/19 Java/Android