在$ rootScope上运行$ apply与任何其他范围

Roy*_*ove 37 angularjs angularjs-scope

$apply函数可以在任何范围内运行,包括$rootScope.

如果我在本地范围内运行它或者我在我的运行中运行它会有什么不同$rootScope吗?

我问,因为我想创建一个包含给定函数的辅助函数$apply.要做到这一点,我总是需要传入一个范围,这是A)烦人和B)不容易,因为我不一定有本地范围.

我想总是有帮助我的函数调用$apply$rootScope,但如果有在做一些风险.

Pie*_*len 46

$apply在任何范围上运行总会产生一个$rootscope.$digest.唯一可能产生影响的情况是当你提供一个表达式作为参数时$apply.表达式会在当前范围内(相对于$ rootScope)进行评估,但事后$rootscope.$digest总是调用.

源代码非常清楚:rootScope.js

底线:如果你$apply没有参数调用,它没有任何区别.

  • 我对$ anyScope感到厌恶.$ apply(function(){/*抛出错误*/})vs/*thorws错误*/; $ anyScope.$ apply().后者是不经过角度的错误处理程序 (6认同)
  • 如果apply with no参数之前的代码抛出异常,则会有所不同.角度的错误处理不会捕获该异常. (5认同)

小智 15

另一个原因是运行$apply$rootScope而不是$scope通常来自对我来说,当我需要调用$apply中将由不同的控制器,因此不同范围使用的服务.
在这种情况下,我更愿意注入$rootScope服务并在其上调用$ apply,而不必担心将来会使用哪个服务范围.

  • 重点..事实上,将范围传递给服务应该是一个记录在案的反模式 (3认同)

dhe*_*man 11

在任何给定范围上运行$ digest/$ apply将使用深度优先遍历访问所有其他范围:

https://github.com/angular/angular.js/blob/3967f5f7d6c8aa7b41a5352b12f457e2fbaa251a/src/ng/rootScope.js#L550-L558

这意味着唯一的区别是$ digest将从它调用的任何$ scope开始