Angular JS:$ Scope.Apply()

use*_*808 0 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)
Run Code Online (Sandbox Code Playgroud)

我在这个论坛中已经读到删除添加$ scope.apply()将解决问题.

angularjs $ scope.$ apply()给出了这个错误:错误:[$ rootScope:inprog]

我实现了从代码中删除多个$ scope.apply()的相同解决方案.错误消失了,但我想知道如何以及为什么?

任何人都可以解释.

提前致谢.

小智 5

$scope.apply()是一个更新DOM的触发器,在大多数情况下(例如来自DOM的触发器,如触发器ng-click的评估在$scope.apply()传递给控制器​​时被包装.你通常不需要调用$scope.apply()它,因为它已经是正在处理,但如果您遇到无法正确更新的问题,您可以使用$scope.apply()它来基本上轻推更新.为了防止在申请已被评估时调用申请,您可以进行安全检查,如下所示:

if (!$scope.$$phase)
    $scope.apply();
Run Code Online (Sandbox Code Playgroud)

$$phase是一个角度内部属性,当没有范围应用正在进行时为null/undefined,并且在a $scope.apply()执行时具有值.

$scope.apply() 通过查找最多子范围(最里面的范围)并检查更改,调用监视等,然后它爬行范围直到它到达根范围,因此您可能会认为这是一个相当沉重的调用,应该是尽可能避免.