Angular $ scope。$ digest vs $ scope。$ apply

时间:2016-03-06 11:19:20

标签: angularjs

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

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

但是使用

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

没有任何反应......

我认为他们做同样的事情。我错了什么?

4 个答案:

答案 0 :(得分:46)

$apply()$digest()有一些相似之处和不同之处。它们之间的相似之处在于它们都检查了更改内容并更新了用户界面并解雇了任何观察者。

两者之间的一个区别是如何调用它们。在没有任何参数的情况下调用$digest()$apply()接受一个在执行任何更新之前将执行的函数。

另一个区别是它们的影响。 $digest()将更新当前范围和任何子范围。 $apply()将更新每个范围。所以大部分时间$digest()都是你想要的,效率更高。

解释为什么$apply()采用函数的最终差异是它们如何处理观察者中的异常。 $apply()会将异常传递给$exceptionHandler(在内部使用try-catch块),而$digest()则需要您自己处理异常。

答案 1 :(得分:2)

我认为你必须浏览文件$apply

  

$ apply()用于从外部执行角度表达式   角度框架

     

通常,您不直接在控制器或中调用$ digest()   指令。相反,你应该调用$ apply()(通常来自a   指令),它将强制$ digest()。

同样根据Jorg的建议,使用$timeout

答案 2 :(得分:2)

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

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

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

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

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

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

答案 3 :(得分:0)

this文章提供了对 $ watch,$ apply和$ digest 的更好理解。

简单地说,
$ watch ,用于检测用户界面中的更改 $ apply 会告诉$ digest循环应该应用哪些更改 $ digest 循环会运行,并会询问每个$ watch的更改,DOM会根据已应用的内容进行相应更改

您应该只拨打 $ apply