Running $apply on $rootScope vs any other scope

前端 未结 4 2114
故里飘歌
故里飘歌 2021-01-07 16:11

The $apply function can run on any scope, including $rootScope.

Are there cases when it makes a difference if I run it on my local scope or

相关标签:
4条回答
  • 2021-01-07 16:39

    Running $digest/$apply on any given scope will visit all other scopes using depth-first traversal:

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

    That means that the only difference is that the $digest will start at whatever $scope it was called on

    0 讨论(0)
  • 2021-01-07 16:43

    Running $apply on any scope always results in a $rootscope.$digest. The only case where it might make a difference is when you provide an expression as an argument to $apply. The expression will be evaluated in the current scope (vs. $rootScope), but afterwards $rootscope.$digest is always called.

    The source code is quite clear: rootScope.js

    Bottom line: If you call $apply with no arguments, it makes no difference.

    0 讨论(0)
  • 2021-01-07 16:48

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

    0 讨论(0)
  • 2021-01-07 17:04

    Another reason for running $apply on the $rootScope instead of $scope typically comes for me when I need to call $apply in a service which will be used by different controllers and therefore different scopes.
    In this cases I prefer to inject the $rootScope to the service and call $apply on it without worrying on which scopes the service will be used in the future.

    0 讨论(0)
提交回复
热议问题