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中怎么做对象的类型判断
Nov 11 Javascript
常规表格多表头查询示例
Feb 21 Javascript
js实现每日自动换一张图片的方法
May 04 Javascript
JavaScript的Polymer框架中dom-repeat与VM的相关操作
Jul 29 Javascript
用js实现博客打赏功能
Oct 24 Javascript
Jquery UI实现一次拖拽多个选中的元素操作
Dec 01 Javascript
Bootstrap表单使用方法详解
Feb 17 Javascript
微信小程序 选项卡的简单实例
May 24 Javascript
vue修改vue项目运行端口号的方法
Aug 04 Javascript
vue树形结构获取键值的方法示例
Jun 21 Javascript
Vue引入Stylus知识点总结
Jan 16 Javascript
vue组件系列之TagsInput详解
May 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
php+ajax实现文件切割上传功能示例
2020/03/03 PHP
JXTree对象,读取外部xml文件数据,生成树的函数
2007/04/02 Javascript
jquery1.4.2 for Visual studio 2010 模板文件
2010/07/14 Javascript
JavaScript 操作table,可以新增行和列并且隔一行换背景色代码分享
2013/07/05 Javascript
JavaScript中为什么null==0为false而null大于=0为true(个人研究)
2013/09/16 Javascript
jQuery把表单元素变为json对象
2013/11/06 Javascript
使用jquery.validate自定义方法实现"手机号码或者固话至少填写一个"的逻辑验证
2014/09/01 Javascript
jQuery事件绑定与解除绑定实现方法
2015/04/15 Javascript
JQuery插件jcarousellite的参数中文说明
2015/05/11 Javascript
jQuery实现动画效果circle实例
2015/08/06 Javascript
bootstrap suggest下拉框使用详解
2017/04/10 Javascript
20170918 前端开发周报之JS前端开发必看
2017/09/18 Javascript
详解NodeJs开发微信公众号
2018/05/25 NodeJs
详解Node.js 中使用 ECDSA 签名遇到的坑
2018/11/26 Javascript
浅谈layui框架自带分页和表格重载的接口解析问题
2019/09/11 Javascript
Vue-cli4 配置 element-ui 按需引入操作
2020/09/11 Javascript
[02:45]2016年中国刀塔全程回顾,完美“圣”典即将上演
2016/12/15 DOTA
python实现的udp协议Server和Client代码实例
2014/06/04 Python
举例讲解Python程序与系统shell交互的方式
2015/04/09 Python
python3.6+django2.0开发一套学员管理系统
2018/03/03 Python
python发送邮件脚本
2018/05/22 Python
pandas值替换方法
2018/07/10 Python
Python实现钉钉订阅消息功能
2020/01/14 Python
Java中compareTo和compare的区别
2016/04/12 面试题
联强国际笔试题面试题
2013/07/10 面试题
小学生检讨书大全
2014/02/06 职场文书
外贸采购员岗位职责
2014/03/08 职场文书
公司法人授权委托书范本
2014/09/12 职场文书
党员民主评议总结
2014/10/20 职场文书
离退休人员聘用协议书
2014/11/24 职场文书
2014年防汛工作总结
2014/12/08 职场文书
公积金接收函格式
2015/01/30 职场文书
2015年大学组织委员个人工作总结
2015/10/23 职场文书
python本地文件服务器实例教程
2021/05/02 Python
Java如何实现通过键盘输入一个数组
2022/02/15 Java/Android
一篇文章了解正则表达式的替换技巧
2022/02/24 Javascript