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 相关文章推荐
一段实时更新的时间代码
Jul 07 Javascript
jQuery与其它库冲突的解决方法
Jun 25 Javascript
Javascript创建Silverlight Plugin以及自定义nonSilverlight和lowSilverlight样式
Jun 28 Javascript
jquery 选项卡效果 新手代码
Jul 08 Javascript
jquery插件实现鼠标经过图片右侧显示大图的效果(类似淘宝)
Feb 04 Javascript
js数组中如何随机取出一个值
Jun 13 Javascript
touch.js 拖动、缩放、旋转 (鼠标手势)功能代码
Feb 04 Javascript
fullPage.js和CSS3实现全屏滚动效果
May 05 Javascript
关于jQuery.ajax()的jsonp碰上post详解
Jul 02 jQuery
vue2 全局变量的设置方法
Mar 09 Javascript
javascript动态创建对象的属性详解
Nov 07 Javascript
基于elementUI使用v-model实现经纬度输入的vue组件
May 12 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 flush类输出缓冲剖析
2008/10/19 PHP
PHP Cookie的使用教程详解
2013/06/03 PHP
Zend Framework教程之Zend_Controller_Plugin插件用法详解
2016/03/07 PHP
Yii2前后台分离及migrate使用(七)
2016/05/04 PHP
详解PHP原生DOM对象操作XML的方法
2016/10/17 PHP
ExtJS Store的数据访问与更新问题
2010/04/28 Javascript
jquery实现通用版鼠标经过淡入淡出效果
2014/06/15 Javascript
jQuery中on()方法用法实例
2015/01/19 Javascript
iPhone手机上搭建nodejs服务器步骤方法
2015/07/06 NodeJs
jQuery实现的小图列表,大图展示效果幻灯片示例
2016/10/25 Javascript
vue.js实现含搜索的多种复选框(附源码)
2017/03/23 Javascript
vue init失败简单解决方法(终极版)
2017/12/22 Javascript
vue+element实现批量删除功能的示例
2018/02/28 Javascript
使用vue-route 的 beforeEach 实现导航守卫(路由跳转前验证登录)功能
2018/03/22 Javascript
JavaScript使用math.js进行精确计算操作示例
2018/06/19 Javascript
JavaScript对象拷贝与Object.assign用法实例分析
2018/06/20 Javascript
详解vue中router-link标签所必备了解的属性
2019/04/15 Javascript
修改layui的后台模板的左侧导航栏可以伸缩的方法
2019/09/10 Javascript
Vue项目如何引入bootstrap、elementUI、echarts
2020/11/26 Vue.js
[02:48]DOTA2超级联赛专访海涛:你们的选择没有错
2013/06/07 DOTA
[43:03]LGD vs Newbee 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
Python环境变量设置方法
2016/08/28 Python
python 2.6.6升级到python 2.7.x版本的方法
2016/10/09 Python
python多进程实现进程间通信实例
2017/11/24 Python
django echarts饼图数据动态加载的实例
2019/08/12 Python
Python迭代器iterator生成器generator使用解析
2019/10/24 Python
python二元表达式用法
2019/12/04 Python
python基于event实现线程间通信控制
2020/01/13 Python
Python 操作 PostgreSQL 数据库示例【连接、增删改查等】
2020/04/21 Python
django 实现后台从富文本提取纯文本
2020/07/02 Python
AVON雅芳官网:世界上最大的美容化妆品公司之一
2016/11/02 全球购物
中学教师实习自我鉴定
2013/09/28 职场文书
汽车运用工程专业毕业生推荐信
2013/12/25 职场文书
留学生如何写好自荐信
2013/12/27 职场文书
《海底世界》教学反思
2014/04/16 职场文书
MySQL利用UNION连接2个查询排序失效详解
2021/11/20 MySQL