有时我需要使用$scope.$apply
,例如当我使用jQuery ajax或一些非angular-js eventlisteners时。在那些情况下,我有一个异步回调,我使用$scope.$apply
,以便通过角度和手表触发范围的变化。如果错误地使用$scope.$apply
,请纠正我。
这似乎有效并且视图已更新。然而,在一些相当罕见的情况下,我得到了“正在进行的摘要”错误。我不知道这是怎么可能的,因为回调不是同步的。所以我想知道我的异步回调是否有可能与正在进行的摘要中的$scope.$apply
碰撞?如果是这样,我该如何防止这种情况发生?
修改
检查摘要的一种可能性是检查$$阶段:if (!$scope.$$phase) $scope.$apply()
但是这是一个反模式,因为angularjs wiki说:https://github.com/angular/angular.js/wiki/Anti-Patterns
我想完全理解为什么我可能在异步回调中遇到摘要。为什么这是一个反模式。
答案 0 :(得分:1)
您正在现有作用域上调用$apply
,因此在您正在消化的情况下,您可以调用apply。有些人可能会建议检查$$阶段,但不建议将其作为an anti-pattern
如果您遇到此问题,即使偶尔也会遇到两种选择。一个是反模式所暗示的,并确保你的$scope.$apply
尽可能高。
但是,如果您在快速连续中异步调用同一$ scope上的$apply
,这将无济于事。那么答案往往是throttle $apply
,所以它每隔几百毫秒就会发生一次。这种情况在使用类似socket.io
的内容时可能会触发可能会导致您重复应用多次的事件。
答案 1 :(得分:1)
我最近问了一个类似的问题,为什么if (!$scope.$$phase) $scope.$apply()
在这里是反模式:Why is using if(!$scope.$$phase) $scope.$apply() an anti-pattern?
那里的答案也包含了这个问题的答案。
答案 2 :(得分:0)
我认为,这是正常的,但将代码移植到具有角度风格的服务和资源会更好。为了防止错误,您可以检查当前状态
scope.$$phase
防止调用$ apply
答案 3 :(得分:0)
Async Callbacks是使用$ apply的合适时间,我遇到了一些Edgecases,我得到了那个错误。他们通常是因为我做了一些不稳定的事情,我发现了一个" Conditional Apply"适用于这些。
if(!$scope.$$phase) {
//$digest or $apply
}
AngularJS : Prevent error $digest already in progress when calling $scope.$apply()