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中style属性
Oct 11 Javascript
javascript 快速排序函数代码
May 30 Javascript
JS简单的图片放大缩小的两种方法
Nov 11 Javascript
jQuery validate+artdialog+jquery form实现弹出表单思路详解
Apr 18 Javascript
使用Bootstrap框架制作查询页面的界面实例代码
May 27 Javascript
浅谈时钟的生成(js手写简洁代码)
Aug 20 Javascript
利用vue-router实现二级菜单内容转换
Nov 30 Javascript
JavaScript实现公历转农历功能示例
Feb 13 Javascript
vue-week-picker实现支持按周切换的日历
Jun 26 Javascript
vue+axios实现post文件下载
Sep 25 Javascript
在 Vue 中使用 JSX 及使用它的原因浅析
Feb 10 Javascript
24个ES6方法解决JS实际开发问题(小结)
May 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
php判断表是否存在的方法
2015/06/18 PHP
PHP+Redis开发的书签案例实战详解
2019/07/09 PHP
php写入txt乱码的解决方法
2019/09/17 PHP
别了 JavaScript中的isXX系列
2012/08/01 Javascript
JS中的forEach、$.each、map方法推荐
2016/04/05 Javascript
JS动态改变浏览器标题的方法
2016/04/06 Javascript
js获取上传文件的绝对路径实现方法
2016/08/02 Javascript
layui文件上传实现代码
2017/05/20 Javascript
jquery实现倒计时小应用
2017/09/19 jQuery
Scala解析Json字符串的实例详解
2017/10/11 Javascript
JS获取input[file]的值并显示在页面的实现方法
2018/03/09 Javascript
动态加载、移除js/css文件的示例代码
2018/03/20 Javascript
JavaScript设计模式之构造函数模式实例教程
2018/07/02 Javascript
基于javascript实现贪吃蛇经典小游戏
2020/04/10 Javascript
跟老齐学Python之画圈还不简单吗?
2014/09/20 Python
在Python中操作时间之tzset()方法的使用教程
2015/05/22 Python
Python的pycurl包用法简介
2015/11/13 Python
使用Python编写基于DHT协议的BT资源爬虫
2016/03/19 Python
django1.8使用表单上传文件的实现方法
2016/11/04 Python
python 开发的三种运行模式详细介绍
2017/01/18 Python
浅谈python和C语言混编的几种方式(推荐)
2017/09/27 Python
python通过微信发送邮件实现电脑关机
2018/06/20 Python
python中ImageTk.PhotoImage()不显示图片却不报错问题解决
2018/12/06 Python
PyTorch搭建多项式回归模型(三)
2019/05/22 Python
CSS3 clip-path 用法介绍详解
2018/03/01 HTML / CSS
HTML+CSS3模拟心的跳动实例代码
2017/09/05 HTML / CSS
英国知名的护肤彩妆与时尚配饰大型综合零售电商:Unineed
2016/11/21 全球购物
美国在线奢侈品寄售商店:Luxury Garage Sale
2018/08/19 全球购物
Hotels.com泰国:酒店预订网站
2019/11/20 全球购物
优秀导游先进事迹材料
2014/01/25 职场文书
国际贸易专业自荐信
2014/06/10 职场文书
销售人员工作自我评价
2014/09/21 职场文书
商务邀请函
2015/01/30 职场文书
教师求职自荐信范文
2015/03/04 职场文书
2015年五一劳动节慰问信
2015/03/23 职场文书
交通安全温馨提示语
2015/07/14 职场文书