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 相关文章推荐
WebGame《逆转裁判》完整版 代码下载(1月24日更新)
Jan 29 Javascript
JavaScript 设计模式之组合模式解析
Apr 09 Javascript
jquery中的ajax方法怎样通过JSONP进行远程调用
May 04 Javascript
JavaScript引用类型和基本类型详解
Jan 06 Javascript
JS简单实现仿百度控制台输出信息效果
Sep 04 Javascript
vue获取input输入值的问题解决办法
Oct 17 Javascript
微信小程序实现页面跳转传值以及获取值的方法分析
Dec 18 Javascript
redux-saga 初识和使用
Mar 10 Javascript
深入浅出了解Node.js Streams
May 27 Javascript
layui上传图片到服务器的非项目目录下的方法
Sep 26 Javascript
jQuery实现简单弹幕效果
Nov 28 jQuery
vue 动态组件(component :is) 和 dom元素限制(is)用法说明
Sep 04 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中函数的形参与实参的问题说明
2010/09/01 PHP
PHP实现扎金花游戏之大小比赛的方法
2015/03/10 PHP
php三元运算符知识汇总
2015/07/02 PHP
初识ThinkPHP控制器
2016/04/07 PHP
使用js实现一个可编辑的select下拉列表
2014/02/20 Javascript
IE8中使用javascript动态加载CSS的解决方法
2014/06/17 Javascript
JS不能跨域借助jquery获取IP地址的方法
2014/08/20 Javascript
微信JS接口汇总及使用详解
2015/01/09 Javascript
使用jQueryMobile实现滑动翻页效果的方法
2015/02/04 Javascript
MVC+jQuery.Ajax异步实现增删改查和分页
2020/12/22 Javascript
玩转JavaScript OOP - 类的实现详解
2016/06/08 Javascript
HTML5基于Tomcat 7.0实现WebSocket连接并实现简单的实时聊天
2016/10/31 Javascript
js模糊查询实例分享
2016/12/26 Javascript
canvas实现探照灯效果
2017/02/07 Javascript
Angular 2.0+ 的数据绑定的实现示例
2017/08/09 Javascript
JS基于贪心算法解决背包问题示例
2017/11/27 Javascript
浅谈node模块与npm包管理工具
2018/01/03 Javascript
微信小程序MUI侧滑导航菜单示例(Popup弹出式,左侧不动,右侧滑动)
2019/01/23 Javascript
layer ui 导入文件之前传入数据的实例
2019/09/23 Javascript
mpvue 页面预加载新增preLoad生命周期的两种方式
2019/10/17 Javascript
javascript设计模式 ? 访问者模式原理与用法实例分析
2020/04/26 Javascript
Python程序语言快速上手教程
2012/07/18 Python
Python中一些不为人知的基础技巧总结
2018/05/19 Python
Python数据库封装实现代码示例解析
2020/09/05 Python
Python 使用SFTP和FTP实现对服务器的文件下载功能
2020/12/17 Python
Python 爬取淘宝商品信息栏目的实现
2021/02/06 Python
美国高街时尚品牌:OASAP
2016/07/24 全球购物
应届生污水处理求职信
2013/11/06 职场文书
婚庆公司的创业计划书
2014/01/22 职场文书
优秀班集体获奖感言
2014/02/03 职场文书
测试工程师职业规划书
2014/02/06 职场文书
家长对孩子的评语
2014/04/18 职场文书
户籍证明书标准模板
2014/09/10 职场文书
小学生安全保证书
2015/05/09 职场文书
帝企鹅日记观后感
2015/06/10 职场文书
百善孝为先:关于孝道的经典语录
2019/10/18 职场文书