我发现自从以角度构建应用程序以来,我需要越来越多地手动将页面更新到我的范围。
我唯一知道的方法是$apply()从控制器和指令的范围进行调用。问题是它不断向显示以下内容的控制台抛出错误:
$apply()
错误:$ digest已经在进行中
有谁知道如何避免这种错误或以不同的方式实现相同的目的?
不要使用此模式 -最终将导致更多错误,无法解决。即使您认为它可以修复某些问题,也没有。
您可以$digest通过检查来检查a 是否已经在进行中$scope.$$phase。
$digest
$scope.$$phase
if(!$scope.$$phase) { //$digest or $apply }
$scope.$$phase将返回,"$digest"或者"$apply"如果正在进行$digest或$apply。我认为这些状态之间的区别在于,$digest它将处理当前范围及其子项$apply的监视,并将处理所有范围的监视者。
"$digest"
"$apply"
$apply
就@ dnc253而言,如果您发现自己打电话$digest或$apply经常打电话,则可能是做错了。通常,由于Angular无法触发DOM事件而需要更新作用域的状态时,我通常需要进行摘要。例如,当一个Twitter引导模态被隐藏时。有时DOM事件在a $digest进行时触发,有时不触发。这就是为什么我使用这张支票。
如果有人知道,我想知道一种更好的方法。
来自评论:@anddoutoi
angular.js反模式
不这样做if (!$scope.$$phase) $scope.$apply(),这意味着您$scope.$apply()在调用堆栈中不够高。
if (!$scope.$$phase) $scope.$apply()
$scope.$apply()