当前位置: 首页 > 编程笔记 >

angularjs 中$apply,$digest,$watch详解

贝研
2023-03-14
本文向大家介绍angularjs 中$apply,$digest,$watch详解,包括了angularjs 中$apply,$digest,$watch详解的使用技巧和注意事项,需要的朋友参考一下

如果你对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,因为他并不知道你的数据在什么时候是最新的

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

 类似资料:
  • 问题内容: 我不知道如何使用和。官方文档没有帮助。 我不明白的是: 他们连接到DOM吗? 如何更新对模型的DOM更改? 它们之间的连接点是什么? 我尝试了本教程,但这需要对它的理解并且理所当然。 做什么和做什么,以及如何正确使用它们? 问题答案: 您需要了解AngularJS的工作原理才能理解它。 消化周期和作用域 首先,AngularJS定义了所谓的 摘要循环 的概念。这个周期可以看作是一个循环

  • 问题内容: 我只想知道火热的使用方法。在控制器内,以下代码可以正常工作,并且在3秒后更新DOM: 但是通过使用 没发生什么事… 我以为他们做同样的事情。我怎么了? 问题答案: 并有一些异同。它们的相似之处在于它们都检查了更改内容并更新了UI并触发了所有观察程序。 两者之间的区别是它们的调用方式。被调用而没有任何参数。具有在执行任何更新之前将要执行的功能。 另一个区别是它们的影响。将更新当前范围和任

  • 本文向大家介绍AngularJS中$apply方法和$watch方法用法总结,包括了AngularJS中$apply方法和$watch方法用法总结的使用技巧和注意事项,需要的朋友参考一下 本文实例总结了AngularJS中$apply方法和$watch方法用法。分享给大家供大家参考,具体如下: 引言 最近在项目中封装控件的时候用到了$watch方法来监听module中的值的变化,当时小编对这个方法

  • 问题内容: 如果我有一个指令可以响应示波器上特定属性的状态,并且我想在测试中更改该属性并验证其是否正确响应,那是进行此更改的最佳方法? 我已经看过这两种模式: 和 它们之间有什么区别,哪个更好,为什么? 问题答案: 会在当前范围及其所有子级上触发监视程序。将评估传递的函数并运行。 第一个更快,因为它需要评估观察者的当前范围及其子级。第二个比较慢,因为它需要评估观察者及其所有子作用域。 当其中一个观

  • 我正在用一个指令计算html元素的最小高度,当我试图通过scope.$apply()更新父作用域值时,我得到以下错误: 我的指示是: 我总是可以使用更新父作用域值,但在这种情况下,指令的作用域规则将不起作用(例如,如果我想通过“@”隔离作用域,则ctrl仍将接收更新)。 此外,我可以通过设置min-height值,但我希望以角度的方式进行。 问题出在哪里? *使用angular 1.3.5处理任何

  • 问题内容: 我发现自从以角度构建应用程序以来,我需要越来越多地手动将页面更新到我的范围。 我唯一知道的方法是从控制器和指令的范围进行调用。问题是它不断向显示以下内容的控制台抛出错误: 错误:$ digest已经在进行中 有谁知道如何避免这种错误或以不同的方式实现相同的目的? 问题答案: 不要使用此模式 -最终将导致更多错误,无法解决。即使您认为它可以修复某些问题,也没有。 您可以通过检查来检查a