$ scope。$ root和$ rootScope有什么区别?

我在控制器中看到$ scope有$ root,这是什么? 它和$ rootScope有什么不同,它可以注入到控制器中?

$rootScope var指向所有范围的父级,并且可以注入到处。 所有其他作用域都是$rootScope 。 它们是通过$rootScope$new方法创build的,因此每个作用域都从$rootScopeinheritance。

Scope构造函数定义的angular源中有一行 :

  function Scope() { this.$id = nextUid(); ... this['this'] = this.$root = this; ... 

看起来$root var只是创build第一个作用域的占位符 – $rootScope

接下来是$new方法中的这段代码 :

  $new: function(isolate) { ... if (isolate) { child = new Scope(); child.$root = this.$root; ... return child; 

所以$rootScope的每个作用域子$rootScope$root var是对$rootScope的引用。 而这些孩子的所有孩子都会得到相同的参考$rootScope

在我看来,最好是通过dependency injection来使用$rootScope ,因为它是一种显式的和整体上更常用的方法来引用$rootScope

如前所述, $scope.$root持有对$rootScope的引用。

不幸的是,使用$scope.$root和使用$rootScope是有区别的:

  1. $scope是根时,它的$root属性是null
  2. $scope.$root只在隔离范围上分配: https : //github.com/angular/angular.js/blob/v1.3.6/src/ng/rootScope.js#L204

所以你可能会遇到$scope.$rootnull 。 更好地使用$rootScope来代替…