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二维数组采用定义数组的数组来实现
Dec 09 Javascript
JS合并数组的几种方法及优劣比较
Sep 19 Javascript
在浏览器中实现图片粘贴的jQuery插件-- pasteimg使用指南
Dec 29 Javascript
JS实现的自定义水平滚动字体插件完整实例
Jun 17 Javascript
Bootstrap 布局组件(全)
Jul 18 Javascript
BootStrap Fileinput的使用教程
Dec 30 Javascript
javaScript生成支持中文带logo的二维码(jquery.qrcode.js)
Jan 03 Javascript
Angular 输入框实现自定义验证功能
Feb 19 Javascript
js中toString()和String()区别详解
Mar 23 Javascript
微信小程序云开发如何使用npm安装依赖
May 18 Javascript
我要点爆”微信小程序云开发之项目建立与我的页面功能实现
May 26 Javascript
VueCli4项目配置反向代理proxy的方法步骤
May 17 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+js实现图片的上传、裁剪、预览、提交示例
2013/08/27 PHP
php实现两个数组相加的方法
2015/02/17 PHP
浅谈php7的重大新特性
2015/10/23 PHP
php+html5实现无刷新图片上传教程
2016/01/22 PHP
PHP实现将多个文件压缩成zip格式并下载到本地的方法示例
2018/05/23 PHP
最近项目写了一些js,水平有待提高
2009/01/31 Javascript
jQuery选中select控件 无法设置selected的解决方法
2010/09/01 Javascript
iframe子页面与父页面在同域或不同域下的js通信
2014/05/07 Javascript
Node.js的MongoDB驱动Mongoose基本使用教程
2016/03/01 Javascript
layui导航栏实现代码
2017/05/19 Javascript
详谈Node.js之操作文件系统
2017/08/29 Javascript
详解Angular中通过$location获取地址栏的参数
2018/08/02 Javascript
react build 后打包发布总结
2018/08/24 Javascript
浅谈Vue.js 中的 v-on 事件指令的使用
2018/11/25 Javascript
详解vue中使用transition和animation的实例代码
2020/12/12 Vue.js
微信小程序实现购物车小功能
2020/12/30 Javascript
通过滑动翻页效果实现和移动端click事件问题
2021/01/26 Javascript
[00:17]天涯墨客一技能展示
2018/08/25 DOTA
详解Python的Flask框架中的signals信号机制
2016/06/13 Python
使用Python的toolz库开始函数式编程的方法
2018/11/15 Python
对Python捕获控制台输出流的方法详解
2019/01/07 Python
将python图片转为二进制文本的实例
2019/01/24 Python
浅谈python的深浅拷贝以及fromkeys的用法
2019/03/08 Python
python 实现在tkinter中动态显示label图片的方法
2019/06/13 Python
Python标准库itertools的使用方法
2020/01/17 Python
解决Keras中CNN输入维度报错问题
2020/06/29 Python
基于python实现监听Rabbitmq系统日志代码示例
2020/11/28 Python
耐克奥地利官网:Nike奥地利
2019/08/16 全球购物
个人自我评价范文
2014/02/05 职场文书
《开国大典》教学反思
2014/04/19 职场文书
售后客服个人自我评价
2014/09/14 职场文书
2014党支部对照检查材料思想汇报
2014/10/05 职场文书
房屋授权委托书范本
2014/10/07 职场文书
学校党的群众路线教育实践活动个人整改方案
2014/10/31 职场文书
月考总结与反思
2015/10/22 职场文书
导游词之淮安明祖陵
2019/11/25 职场文书