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 相关文章推荐
利用onresize使得div可以随着屏幕大小而自适应的代码
Jan 15 Javascript
jQuery下的几个你可能没用过的功能
Aug 29 Javascript
js禁止小键盘输入数字功能代码
Aug 01 Javascript
{}与function(){}选用空对象{}来存放keyValue
May 23 Javascript
使用非html5实现js板连连看游戏示例代码
Sep 22 Javascript
jQuery实现切换字体大小的方法
Mar 10 Javascript
javascript随机显示背景图片的方法
Jun 18 Javascript
详解javascript跨浏览器事件处理程序
Mar 27 Javascript
理解javascript中的闭包
Jan 11 Javascript
vue.js编译时给生成的文件增加版本号
Sep 17 Javascript
一步一步实现Vue的响应式(对象观测)
Sep 02 Javascript
原生JavaScript实现弹幕组件的示例代码
Oct 12 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中使用Oracle数据库(4)
2006/10/09 PHP
PHP ajax 分页类代码
2008/11/13 PHP
php 获取客户端的真实ip
2009/11/30 PHP
php下使用curl模拟用户登陆的代码
2010/09/10 PHP
PHP中怎样保持SESSION不过期 原理及方案介绍
2013/08/08 PHP
PHP导入导出Excel代码
2015/07/07 PHP
yii2.0实现验证用户名与邮箱功能
2015/12/22 PHP
jquery 指南/入门基础
2007/11/30 Javascript
javascript倒计时功能实现代码
2012/06/07 Javascript
HTTP 304错误的详细讲解
2013/11/13 Javascript
JS实现控制表格行文本对齐的方法
2015/03/30 Javascript
javascript基于DOM实现权限选择实例分析
2015/05/14 Javascript
jQuery实现简单的DIV拖动效果
2016/02/19 Javascript
gulp教程_从入门到项目中快速上手使用方法
2017/09/14 Javascript
Vue使用Clipboard.JS在h5页面中复制内容实例详解
2019/09/03 Javascript
在JavaScript中查找字符串中最长单词的三种方法(推荐)
2021/01/18 Javascript
[02:40]DOTA2超级联赛专访430 从小就爱玩对抗性游戏
2013/06/18 DOTA
[25:45]2018DOTA2亚洲邀请赛4.5SOLO赛 Sylar vs Paparazi
2018/04/06 DOTA
在Python中操作字典之update()方法的使用
2015/05/22 Python
Python单元测试与测试用例简析
2019/11/09 Python
Python图像处理库PIL中图像格式转换的实现
2020/02/26 Python
Python3.7.0 Shell添加清屏快捷键的实现示例
2020/03/23 Python
详解pandas.DataFrame.plot() 画图函数
2020/06/14 Python
Django中F函数的使用示例代码详解
2020/07/06 Python
python time.strptime格式化实例详解
2021/02/03 Python
Puritan’s Pride(普丽普莱)官方网站:美国最大最全的保健品公司之一
2016/10/23 全球购物
意大利一家专营包包和配饰的网上商店:Borse Last Minute
2019/08/26 全球购物
Gerry Weber德国官网:优质女性时装,德国最大的时装公司之一
2019/11/02 全球购物
奥地利时尚、美容、玩具和家居之家:Kastner & Öhler
2020/04/26 全球购物
VC++笔试题
2014/10/13 面试题
2014年五一劳动节社区活动总结
2014/04/14 职场文书
煤矿安全承诺书
2014/05/22 职场文书
2015年三八妇女节活动总结
2015/02/06 职场文书
暑期家教宣传单
2015/07/14 职场文书
JavaScript文档对象模型DOM
2021/11/20 Javascript
MYSQL如何查看操作日志详解
2022/05/30 MySQL