37

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

如果我在本地范围内运行它或在我的$rootScope.

我问是因为我想创建一个辅助函数,将给定函数包装在$apply. 为此,我总是需要传入一个范围,这 A) 烦人且 B) 不容易,因为我不一定有本地范围。

我希望始终在$apply上调用我的辅助函数$rootScope,但如果这样做有风险,则不会。

4

4 回答 4

48

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

源码很清楚:rootScope.js

底线:如果您$apply不带参数调用,则没有区别。

于 2013-11-29T10:56:27.703 回答
15

当我需要调用将由不同控制器使用的服务时,通常会出现$apply$rootScope而不是运行的另一个原因,因此不同的范围。 在这种情况下,我更喜欢将 注入服务并在其上调用 $apply ,而不用担心服务将在未来使用哪些范围。$scope$apply
$rootScope

于 2014-07-31T08:16:23.570 回答
11

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

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

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

于 2013-07-25T22:30:43.557 回答
0

/* 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>

于 2020-03-18T07:53:03.597 回答