该$apply
函数可以在任何范围内运行,包括$rootScope
.
如果我在本地范围内运行它或在我的$rootScope
.
我问是因为我想创建一个辅助函数,将给定函数包装在$apply
. 为此,我总是需要传入一个范围,这 A) 烦人且 B) 不容易,因为我不一定有本地范围。
我希望始终在$apply
上调用我的辅助函数$rootScope
,但如果这样做有风险,则不会。
该$apply
函数可以在任何范围内运行,包括$rootScope
.
如果我在本地范围内运行它或在我的$rootScope
.
我问是因为我想创建一个辅助函数,将给定函数包装在$apply
. 为此,我总是需要传入一个范围,这 A) 烦人且 B) 不容易,因为我不一定有本地范围。
我希望始终在$apply
上调用我的辅助函数$rootScope
,但如果这样做有风险,则不会。
$apply
在任何作用域上运行总是会产生一个$rootscope.$digest
. 唯一可能产生影响的情况是当您将表达式作为参数提供给$apply
. 表达式将在当前范围内进行评估(与 $rootScope 相比),但之后$rootscope.$digest
总是被调用。
源码很清楚:rootScope.js
底线:如果您$apply
不带参数调用,则没有区别。
当我需要调用将由不同控制器使用的服务时,通常会出现$apply
在$rootScope
而不是运行的另一个原因,因此不同的范围。
在这种情况下,我更喜欢将 注入服务并在其上调用 $apply ,而不用担心服务将在未来使用哪些范围。$scope
$apply
$rootScope
在任何给定范围上运行 $digest/$apply 将使用深度优先遍历访问所有其他范围:
这意味着唯一的区别是 $digest 将从调用它的任何 $scope 开始
/* What happens with $apply */
angular.module('myApp',[]).controller('MessageController', function($scope) {
$scope.getMessage = function() {
setTimeout(function() {
$scope.$apply(function() {
//wrapped this within $apply
$scope.message = 'Fetched after 3 seconds';
console.log('message:' + $scope.message);
});
}, 2000);
}
$scope.getMessage();
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.7.5/angular.min.js"></script>
<body ng-app="myApp">
<div ng-controller="MessageController">
Delayed Message: {{message}}
</div>
</body>