小编典典

AngularJS:在调用 $scope.$apply() 时防止错误 $digest 已经在进行中

all

我发现自从以 Angular 构建应用程序以来,我越来越需要手动将页面更新到我的范围。

我知道这样做的唯一方法是$apply()从我的控制器和指令的范围内调用。这样做的问题是它不断向控制台抛出错误,内容如下:

错误:$digest 已经在进行中

有谁知道如何避免此错误或以不同的方式实现相同的目标?


阅读 211

收藏
2022-03-01

共1个答案

小编典典

不要使用这种模式 ——这最终会导致比它解决的更多的错误。即使您认为它修复了某些问题,但它没有。

您可以$digest通过检查来检查 a 是否已经在进行中$scope.$$phase

if(!$scope.$$phase) {
  //$digest or $apply
}

$scope.$$phase将返回"$digest"或者"$apply"如果 a
$digestor$apply正在进行中。我相信这些状态之间的区别在于$digest将处理当前范围及其子范围的手表,$apply并将处理所有范围的观察者。

就@dnc253
而言,如果您发现自己打电话$digest$apply经常打电话,您可能做错了。当我需要更新作用域的状态时,我通常发现我需要消化,因为 DOM
事件在 Angular 范围之外触发​​。例如,当 twitter 引导模式被隐藏时。有时 DOM 事件会在
a$digest正在进行时触发,有时则不会。这就是我使用此检查的原因。

如果有人知道,我很想知道一种更好的方法。


来自评论:@anddoutoi

angular.js 反模式

  1. 不要这样做if (!$scope.$$phase) $scope.$apply(),这意味着你$scope.$apply()在调用堆栈中不够高。
2022-03-01