Angular $scope.$digest vs $scope.$apply



我只是想知道如何使用$digest。在控制器内部,以下代码工作正常,并在 3 秒后更新 DOM:

setTimeout(function(){
    $scope.$apply(function(){
        $scope.name = 'Alice';
    });
}, 3000);

但是通过使用

setTimeout(function(){
        $scope.$digest(function(){
        $scope.name = 'Alice';
        });
    }, 3000);

什么也没发生...

我以为他们做同样的事情。我错了吗?

$apply()$digest()有一些相似之处和不同之处。它们的相似之处在于,它们都检查更改的内容并更新 UI 并触发任何观察者。

两者之间的一个区别是它们的称呼方式。 $digest()被调用没有任何参数。 $apply() 采用一个将在执行任何更新之前执行的函数。

另一个区别是它们的影响。 $digest()将更新当前作用域和任何子作用域。 $apply()将更新每个范围。所以大多数时候$digest()将是你想要的,而且效率更高。

解释为什么$apply()采用函数的最后一个区别是它们如何处理观察程序中的异常。 $apply()会将异常传递给$exceptionHandler(在内部使用 try-catch 块),而$digest()将要求您自己处理异常。

我认为您必须浏览文档$apply

$apply() 用于从 棱角分明的框架

通常,您不会直接$digest在控制器或 指令。相反,您应该调用 $apply()(通常从 指令),这将强制使用 $digest()。

同样按照Jorg的建议,使用$timeout

在angularjs中$scope对象具有不同的函数,如$watch()$digest()$apply(),我们将这些函数称为中心函数。

angularjs 中心函数$watch()$digest() 和 $apply 用于将数据绑定到视图中的变量并观察变量中发生的变化。

通常在 angularjs 中$scope我们使用对象将数据绑定到变量,并在应用程序中需要的任何位置使用该变量值。在 angularjs 中,无论我们用对象分配$scope变量$scope.$watch()都将通过使用函数添加到监视列表中。

在angularjs中,一旦变量添加到监视列表$scope.digest()函数将遍历监视列表变量并检查是否对该变量进行了任何更改。如果发现该监视列表变量的任何更改,则立即相应的事件侦听器函数将调用并使用应用程序的新值更新相应的变量值。

angularjs 中的 $scope.$apply() 函数在我们想将任何其他代码与 angularjs 集成时都会使用。通常,$scope.$apply()函数将执行自定义代码,然后它将强制调用$scope.$digest()函数以检查所有监视列表变量,并在发现监视列表变量的任何更改时更新视图中的变量值。

在大多数情况下,angularjs 将使用 $scope.watch()$scope.digest() 函数根据变量值的变化来检查和更新值。

本文

提供了对$watch、$apply和$digest的更好理解。

只是
用于检测 UI
中更改的$watch$apply会告诉$digest循环应该应用
哪些更改$digest循环将运行并要求每个$watch进行更改,DOM 将针对已应用的内容相应地更改

您应该只拨打$apply

最新更新