Angular JS:$ Scope.Apply()

时间:2015-02-24 06:29:23

标签: angularjs-scope

我想了解更多关于$ 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()的相同解决方案。错误消失了,但我想知道如何以及为什么?

任何人都可以解释一下。

提前致谢。

1 个答案:

答案 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()通过查找最多子范围(最里面的范围)并检查更改,调用监视等,然后它爬行范围直到它到达根范围,因此您可能会想到它是一个相当沉重的呼吁,应尽可能避免。