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 相关文章推荐
Jquery中&quot;$(document).ready(function(){ })&quot;函数的使用详解
Dec 30 Javascript
JavaScript实现在页面间传值的方法
Apr 07 Javascript
JavaScript中的函数嵌套使用
Jun 04 Javascript
json定义及jquery操作json的方法
Sep 29 Javascript
微信小程序-拍照或选择图片并上传文件
Jan 06 Javascript
详解用webpack2搭建angular2的项目
Jun 22 Javascript
js导出Excel表格超出26位英文字符的解决方法ES6
Nov 15 Javascript
vue中实现移动端的scroll滚动方法
Mar 03 Javascript
JavaScript callback回调函数用法实例分析
May 08 Javascript
在vue中使用Autoprefixed的方法
Jul 27 Javascript
vue组件讲解(is属性的用法)模板标签替换操作
Sep 04 Javascript
在vue中使用cookie记住用户上次选择的实例(本次例子中为下拉框)
Sep 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设计模式 FlyWeight (享元模式)
2011/06/26 PHP
smarty模板引擎从配置文件中获取数据的方法
2015/01/22 PHP
jQuery+Ajax+PHP“喜欢”评级功能实现代码
2015/10/08 PHP
PHP7新增函数
2021/03/09 PHP
javascript事件模型代码
2007/07/01 Javascript
基于Jquery的动态创建DOM元素的代码
2010/12/28 Javascript
关于jQuery参考实例 1.0 jQuery的哲学
2013/04/07 Javascript
JavaScript中String.match()方法的使用详解
2015/06/06 Javascript
Backbone.js的一些使用技巧
2015/07/01 Javascript
javascript实现判断鼠标的状态
2015/07/10 Javascript
js实现Form栏显示全格式时间时钟效果代码
2015/08/19 Javascript
js实现div在页面拖动效果
2016/05/04 Javascript
javascript数组遍历的方法实例分析
2016/09/13 Javascript
BootStrap入门教程(三)之响应式原理
2016/09/19 Javascript
一个非常好用的文字滚动的案例,鼠标悬浮可暂停[两种方案任选]
2016/12/01 Javascript
浅谈Vue.nextTick 的实现方法
2017/10/25 Javascript
JS实现带动画的回到顶部效果
2017/12/28 Javascript
vue+springmvc导出excel数据的实现代码
2018/06/27 Javascript
详解在create-react-app使用less与antd按需加载
2018/12/06 Javascript
Python win32com 操作Exce的l简单方法(必看)
2017/05/25 Python
详解django2中关于时间处理策略
2019/03/06 Python
使用python实现抓取腾讯视频所有电影的爬虫
2019/04/15 Python
python命令行参数用法实例分析
2019/06/25 Python
Python numpy矩阵处理运算工具用法汇总
2020/07/13 Python
Django日志及中间件模块应用案例
2020/09/10 Python
python两种注释用法的示例
2020/10/09 Python
印度和世界各地的精美产品:Ikka Dukka
2018/02/12 全球购物
公司保密承诺书
2014/03/27 职场文书
工作评语大全
2014/04/26 职场文书
县政协领导班子群众路线教育实践活动四风问题整改方案
2014/10/26 职场文书
《改造我们的学习》心得体会
2014/11/07 职场文书
企业介绍信范文
2015/01/30 职场文书
煤矿安全学习心得体会
2016/01/18 职场文书
Python爬取某拍短视频
2021/06/11 Python
Python Matplotlib库实现画局部图
2021/11/17 Python
Win11怎么跳过联网验机 ?Win11跳过联网验机激活教程
2022/04/05 数码科技