我想了解更多关于$ scope.apply()的实时使用情况。 我们可以在控制器中使用$ scope.apply()多少次?
例如,我有一些事件,如ng-click(),ng-change(),ng-blur()等。所有事件都在同一个控制器中。对于每个事件,我应该使用$ scope.apply()吗?如果是,我收到错误:
Error: [$rootScope:inprog] [http://errors.angularjs.org/1.2.15/$rootScope/inprog?p0=%24apply][1]
at Error (native)
我已在此论坛中读到删除添加$ scope.apply()将解决此问题。
angularjs $scope.$apply() gives this error: Error: [$rootScope:inprog]
我实现了从代码中删除多个$ scope.apply()的相同解决方案。错误消失了,但我想知道如何以及为什么?
任何人都可以解释一下。
提前致谢。
答案 0 :(得分:5)
$scope.apply()
是更新DOM的触发器,在大多数情况下(例如来自DOM的触发器,如ng-click
,触发器的评估包含在$scope.apply()
中,因为它传递给您的控制器。您通常不需要调用$scope.apply()
,因为它已经被处理,但如果您遇到无法正确更新的问题,您可以基本上使用$scope.apply()
轻推它进行更新。为了防止在申请已被评估时调用申请,您可以进行安全检查,如下所示:
if (!$scope.$$phase)
$scope.apply();
$$phase
是一个角度内部属性,当没有适用范围时,该属性为null / undefined,并且在执行$scope.apply()
时具有值。
$scope.apply()
通过查找最多子范围(最里面的范围)并检查更改,调用监视等,然后它爬行范围直到它到达根范围,因此您可能会想到它是一个相当沉重的呼吁,应尽可能避免。