角度摘要vs应用最佳实践

时间:2016-12-27 11:49:36

标签: angularjs

使用两种不同的方法可以获得相同的结果:

doSomething();
$scope.$digest();

$scope.$apply(function() {
  doSomething();
});

那么有什么不同以及什么时候使用?

4 个答案:

答案 0 :(得分:1)

两者都会做同样的事情。但是,使用$scope.apply()包装为函数是最佳实践。为什么因为当你在$scope.apply()中包装内容时,可以为此编写catch块。 因此,您可以发现可能遇到的任何例外情况。

答案 1 :(得分:1)

AngularJS $digest

  

处理当前范围及其子项的所有观察者。因为观察者的监听器可以改变模型,所以$ digest()不断调用监视器,直到不再有监听器被触发为止。这意味着可以进入无限循环。此函数将抛出“超出最大迭代限制”。如果迭代次数超过10次。

     

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

     

如果您希望在调用$ digest()时收到通知,可以使用$ watch()注册watchExpression函数,但不能使用监听器。

     

在单元测试中,您可能需要调用$ digest()来模拟范围生命周期。

答案 2 :(得分:0)

您可以选中$digest来检查$scope.$$phase是否已经在进度中。

if(!$scope.$$phase) {
  //use anyone yours: $digest or $apply
}

scope.$digest()会激发观察者对当前范围及其所有孩子的看法。 scope.$apply将评估传递的函数并运行$rootScope.$digest()

请参阅:$apply vs $digest in directive testing

答案 3 :(得分:0)

$ scope。$ digest():这是循环过程。因此,当我们调用$scope.$digest()时,它将启动一个摘要周期,并检查范围内的所有观察者是否应该更改,然后将处理脏检查,这将在摘要周期进行时进行检查任何改变,如果改变,那么摘要周期将开始工作。一个不应该调用$ scope。$ digest()手动因为无论什么时候范围发生任何变化都会被调用。更多细节$digest

$ scope。$ apply :在$ scope。$ apply中隐含地告诉你只有受该函数影响的观察者才会更新,或者只会检查特定观察者的更新,它会在内部处理异常,无需人工处理。更多详情$apply