angularjs 中$apply,$digest,$watch详解


Posted in Javascript onOctober 13, 2016

如果你对angular的$apply,$digest,$watch似懂非懂,那我相信下面几句话能让你深刻理解!

此文针对已经了解过$apply,$digest,$watch的同学。也就是说你已经在很多的博客论坛搜索过$apply,$digest,$watch,虽然有点蒙,但似懂非懂的感觉。

如果你从未进行过了解,那本文对你将没有一点帮助!

<!DOCTYPE html>
<html lang="zh-CN" ng-app="app">
<head>
  <meta charset="utf-8">
  <title>angular时钟辅助理解$apply,$digest,$watch</title>
  <link rel="stylesheet" href="../bootstrap.min.css">
</head>
<body ng-controller="myController">

  <div ng-bind="clock.now"></div>


  <script src="../angular.min.js"></script>
  <script>
    angular.module(‘app‘, [])
    .controller(‘myController‘, function($scope, $timeout, $interval) {

      // 第一种
      // $scope.clock = {};
      // var clockFunction = function() {
      //   $scope.clock.now = new Date();
      //   $timeout(function() { // 使用$timeout 来代替setTimeout(),因为前者已经调用了$apply()
      //     clockFunction();
      //   }, 1000)
      //   // setTimeout(function() {
      //   //   $scope.$apply(clockFunction);
      //   // }, 1000)
      // }
      // clockFunction();

      // 第二种
      $scope.clock = {
         now: new Date()
      };   
      var updateClock = function() {
        $scope.clock.now = new Date();
      };   
      setInterval(function() { // 如果不使用$interval 则需要手动调用$apply(),以使已经改变的$scope及时的更新到view
        $scope.$apply(updateClock);

        // 这里可以看出 $scope已经改变但并未及时更新到view
        // updateClock();
        // console.log($scope.clock.now);
      }, 1000);   
      updateClock();
    })
  </script>
</body>
</html>

准备开始!

$apply (通知)
$digest(循环)
$watch(监听)

这里可能与英语的翻译有所差别,但是这不是重点,重点是让你能够理解

angular在监听数据变化并执行双向绑定时一定会做的事情:

通知($apply)angular,告诉他有一个函数test($apply(test)),需要他帮忙做下脏检查($digest脏检查),在做脏检查的同时监听数据变化($watch)并反映到view中

当不在angular上下文中的时候,则需要你手动$apply。如果不做$apply虽然angular能够监听数据变化,但他并不会将数据及时更新到view,因为他并不知道你的数据在什么时候是最新的

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Javascript 相关文章推荐
用js计算页面执行时间的函数
Dec 07 Javascript
javascript学习笔记(二) js一些基本概念
Jun 18 Javascript
JS原型对象通俗&quot;唱法&quot;
Dec 27 Javascript
基于jquery步骤进度条源码分享
Nov 12 Javascript
使用jquery.qrcode.min.js实现中文转化二维码
Mar 11 Javascript
JavaScript数组去重的几种方法效率测试
Oct 23 Javascript
Javascript使用uploadify来实现多文件上传
Nov 16 Javascript
详解ES6语法之可迭代协议和迭代器协议
Jan 13 Javascript
vue中element组件样式修改无效的解决方法
Feb 03 Javascript
vue-router源码之history类的浅析
May 21 Javascript
JS实现水平移动与垂直移动动画
Dec 19 Javascript
基于javascript实现放大镜特效
Dec 03 Javascript
jQuery鼠标事件总结
Oct 13 #Javascript
BootStrap实现邮件列表的分页和模态框添加邮件的功能
Oct 13 #Javascript
jQuery中delegate()方法的用法详解
Oct 13 #Javascript
炫酷的js手风琴效果
Oct 13 #Javascript
轻松搞定js表单验证
Oct 13 #Javascript
Seajs是什么及sea.js 由来,特点以及优势
Oct 13 #Javascript
使用jquery给指定的table动态添加一行、删除一行
Oct 13 #Javascript
You might like
基于PHP遍历数组的方法汇总分析
2013/06/08 PHP
使用PHP Socket写的POP3类
2013/10/30 PHP
php列出mysql表所有行和列的方法
2015/03/13 PHP
php版微信公众号自定义分享内容实现方法
2016/09/22 PHP
javascript基本语法分析说明
2008/06/15 Javascript
setTimeout与setInterval在不同浏览器下的差异
2010/01/24 Javascript
JAVASCRIPT车架号识别/验证函数代码 汽车车架号验证程序
2012/01/08 Javascript
JavaScript Scoping and Hoisting 翻译
2012/07/03 Javascript
js简单实现HTML标签Select联动带跳转
2013/10/23 Javascript
jquery动态更换设置背景图的方法
2014/03/25 Javascript
JQuery中使用.each()遍历元素学习笔记
2014/11/08 Javascript
JS实现生成会变大变小的圆环实例
2015/08/05 Javascript
微信小程序进行微信支付的步骤昂述
2016/12/01 Javascript
nodejs创建简易web服务器与文件读写的实例
2017/09/07 NodeJs
简单的Vue SSR的示例代码
2018/01/12 Javascript
element-ui 上传图片后清空图片显示的实例
2018/09/04 Javascript
15个顶级开源JavaScript框架和库
2018/10/10 Javascript
ES6 fetch函数与后台交互实现
2018/11/14 Javascript
Vue.js 中的 v-model 指令及绑定表单元素的方法
2018/12/03 Javascript
Element的el-tree控件后台数据结构的生成以及方法的抽取
2020/03/05 Javascript
vue项目前端微信JSAPI与外部H5支付相关实现过程及常见问题
2020/04/14 Javascript
[49:40]2018DOTA2亚洲邀请赛小组赛 A组加赛 TNC vs Newbee
2018/04/03 DOTA
使用Python向C语言的链接库传递数组、结构体、指针类型的数据
2019/01/29 Python
如何使用Python自动控制windows桌面
2019/07/11 Python
pytorch 预训练层的使用方法
2019/08/20 Python
用python实现名片管理系统
2020/06/18 Python
纽约通行卡:The New York Pass(免费游览纽约90多个景点)
2017/07/29 全球购物
瑞典轮胎在线:Tirendo.se
2018/06/21 全球购物
龟牌英国商店:Turtle Wax Brand Store UK
2019/07/02 全球购物
英国家居用品和家居装饰品购物网站:Cox & Cox
2019/08/25 全球购物
意大利在线高尔夫商店:Online Golf
2021/03/09 全球购物
如何用Python输出一个Fibonacci数列
2016/08/28 面试题
贷款担保书
2015/01/20 职场文书
MyBatis-Plus 批量插入数据的操作方法
2021/09/25 Java/Android
Java 写一个简单的图书管理系统
2022/04/26 Java/Android
Python TypeError: ‘float‘ object is not subscriptable错误解决
2022/12/24 Python