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 相关文章推荐
ArrayList类(增强版)
Apr 04 Javascript
深入理解JavaScript定时机制
Oct 29 Javascript
Javascript中匿名函数的多种调用方式总结
Dec 06 Javascript
JavaScript中的object转换成number或string规则介绍
Dec 31 Javascript
jQuery选择器源码解读(六):Sizzle选择器匹配逻辑分析
Mar 31 Javascript
JS判断form内所有表单是否为空的简单实例
Sep 09 Javascript
基于Javascript实现文件实时加载进度的方法
Oct 12 Javascript
正则表达式,替换所有HTML标签的简单实例
Nov 28 Javascript
教大家轻松制作Bootstrap漂亮表格(table)
Dec 13 Javascript
爬虫利器Puppeteer实战
Jan 09 Javascript
Vue 样式切换及三元判断样式关联操作
Aug 09 Javascript
vue绑定数字类型 value为数字的实例
Aug 31 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
Search File Contents PHP 搜索目录文本内容的代码
2010/02/21 PHP
php新建文件自动编号的思路与实现
2011/06/27 PHP
php/js获取客户端mac地址的实现代码
2013/07/08 PHP
个人写的PHP验证码生成类分享
2014/08/21 PHP
php数组键名技巧小结
2015/02/17 PHP
ThinkPHP中Common/common.php文件常用函数功能分析
2016/05/20 PHP
PHP使用HTML5 FileApi实现Ajax上传文件功能示例
2019/07/01 PHP
JavaScript 的方法重载效果
2009/08/07 Javascript
理解Javascript_11_constructor实现原理
2010/10/18 Javascript
js读取json的两种常用方法示例介绍
2014/10/19 Javascript
基于Node.js实现nodemailer邮件发送
2016/01/26 Javascript
利用node.js写一个爬取知乎妹纸图的小爬虫
2017/05/03 Javascript
关于使用js算总价的问题
2017/06/23 Javascript
javascript少儿编程关于返回值的函数内容
2018/05/27 Javascript
小程序自定义组件实现城市选择功能
2018/07/18 Javascript
element-ui的回调函数Events的用法详解
2018/10/16 Javascript
关于vue的npm run dev和npm run build的区别介绍
2019/01/14 Javascript
Angular封装表单控件及思想总结
2019/12/11 Javascript
详解vue-template-admin三级路由无法缓存的解决方案
2020/03/10 Javascript
javascript设计模式 ? 中介者模式原理与用法实例分析
2020/04/20 Javascript
[50:27]Secret vs VG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
python使用循环实现批量创建文件夹示例
2014/03/25 Python
windows系统中python使用rar命令压缩多个文件夹示例
2014/05/06 Python
Python黑帽编程 3.4 跨越VLAN详解
2016/09/28 Python
解决Python requests库编码 socks5代理的问题
2018/05/07 Python
python 读取鼠标点击坐标的实例
2018/12/29 Python
Python学习笔记基本数据结构之序列类型list tuple range用法分析
2019/06/08 Python
python 设置xlabel,ylabel 坐标轴字体大小,字体类型
2019/07/23 Python
Python generator生成器和yield表达式详解
2019/08/08 Python
python switch 实现多分支选择功能
2020/12/21 Python
用Python自动清理系统垃圾的实现
2021/01/18 Python
澳大利亚手表品牌:Time IV Change
2018/10/06 全球购物
党员廉洁自律个人总结
2015/02/13 职场文书
军训通讯稿范文
2015/07/18 职场文书
Python使用UDP实现720p视频传输的操作
2021/04/24 Python
浅谈spring boot使用thymeleaf版本的问题
2021/08/04 Java/Android