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 相关文章推荐
extjs实现选择多表自定义查询功能 前台部分(ext源码)
Dec 20 Javascript
Dojo Javascript 编程规范 规范自己的JavaScript书写
Oct 26 Javascript
实例分析js和C#中使用正则表达式匹配a标签
Nov 26 Javascript
JavaScript实现的一个计算数字步数的算法分享
Dec 06 Javascript
jQuery基础语法实例入门
Dec 23 Javascript
Javascript基础教程之比较操作符
Jan 18 Javascript
javascript实现加载xml文件的方法
Nov 24 Javascript
jQueryUI DatePicker 添加时分秒
Jun 04 Javascript
angularJs关于指令的一些冷门属性详解
Oct 24 Javascript
微信小程序 scroll-view实现上拉加载与下拉刷新的实例
Jan 21 Javascript
webstorm和.vue中es6语法报错的解决方法
May 08 Javascript
微信小程序之裁剪图片成圆形的实现代码
Oct 11 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数组的一些常见操作汇总
2011/07/17 PHP
打造超酷的PHP数据饼图效果实现代码
2011/11/23 PHP
[原创]PHP实现逐行删除文件右侧空格的方法
2015/12/25 PHP
Laravel框架实现即点即改功能的方法分析
2019/10/31 PHP
关于document.cookie的使用javascript
2008/04/11 Javascript
用Javascript获取页面元素的具体位置
2013/12/09 Javascript
jquery改变tr背景色的示例代码
2013/12/28 Javascript
浅析angularJS中的ui-router和ng-grid模块
2016/05/20 Javascript
Node.js中文件操作模块File System的详细介绍
2017/01/05 Javascript
Node.js利用debug模块打印出调试日志的方法
2017/04/25 Javascript
JavaScript与Java正则表达式写法的区别介绍
2017/08/15 Javascript
node.js基于fs模块对系统文件及目录进行读写操作的方法详解
2017/11/10 Javascript
js 两数组去除重复数值的实例
2017/12/06 Javascript
使用axios实现上传图片进度条功能
2017/12/21 Javascript
详解多页应用 Webpack4 配置优化与踩坑记录
2018/10/16 Javascript
微信小程序点餐系统开发常见问题汇总
2019/08/06 Javascript
Jquery让form表单异步提交代码实现
2019/11/14 jQuery
微信小程序实现横向滚动导航栏效果
2019/12/12 Javascript
JQuery事件冒泡和默认行为代码实例
2020/05/13 jQuery
jQuery实现简单日历效果
2020/07/05 jQuery
[50:11]2018DOTA2亚洲邀请赛 4.7总决赛 LGD vs Mineski 第三场
2018/04/09 DOTA
使用python将时间转换为指定的格式方法
2018/11/12 Python
python防止随意修改类属性的实现方法
2019/08/21 Python
解决pycharm debug时界面下方不出现step等按钮及变量值的问题
2020/06/09 Python
python2和python3哪个使用率高
2020/06/23 Python
Python csv文件记录流程代码解析
2020/07/16 Python
Html5移动端弹幕动画实现示例代码
2018/08/27 HTML / CSS
乌克兰第一的珠宝网上商店:Gold.ua
2019/11/29 全球购物
汽车维修专业个人求职信范文
2014/01/01 职场文书
乡镇党员干部群众路线对照检查材料思想汇报
2014/09/28 职场文书
2015关于重阳节的演讲稿
2015/03/20 职场文书
新娘婚礼答谢词
2015/09/29 职场文书
小学音乐课歌曲《堆雪人》教学反思
2016/02/18 职场文书
共青团优秀团员申请书(范文)
2019/08/15 职场文书
用Python selenium实现淘宝抢单机器人
2021/06/18 Python
win11自动弹出虚拟键盘怎么关闭? Win11关闭虚拟键盘的技巧
2023/01/09 数码科技