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

Ris*_*tta 42 javascript angularjs angularjs-scope

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

Igo*_*lyk 71

$rootScopevar指向所有范围的父级,可以在任何地方注入.所有其他范围都是儿童的$rootScope.它们是通过$new方法创建的,$rootScope因此每个范围都继承自$rootScope.

在Scope构造函数 定义中的角度源中有一行:

 function Scope() {
   this.$id = nextUid();
 ...
 this['this'] = this.$root =  this;
 ...
Run Code Online (Sandbox Code Playgroud)

似乎$rootvar只是this第一个创建范围的占位符- $rootScope.

接下来在方法中有这段代码$new:

  $new: function(isolate) {
      ...

    if (isolate) {
      child = new Scope();
      child.$root = this.$root;
   ...
   return child;
Run Code Online (Sandbox Code Playgroud)

所以$root每个范围子的var $rootScope都是一个引用$rootScope.这些孩子的所有孩子都会得到同样的参考$rootScope

在我看来,最好使用$rootScopevia依赖注入,因为它是一种明确的,总体上更常用的引用方式$rootScope

  • 很好的解释.我认为$ scope.$ root是为了方便访问模板中的$ rootScope变量,而不需要将$ rootScope包含到控制器中. (8认同)

Dan*_*y R 28

如前所述,$scope.$root持有一个参考$rootScope.

不幸的是,使用$scope.$root和使用之间存在差异$rootScope:

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

所以,你可能会遇到这样的情况$scope.$root是null.更好地使用$rootScope......

  • 错误.无论如何,`$ root` [将会在那里](https://github.com/angular/angular.js/blob/v1.3.6/src/ng/rootScope.js#L135). (8认同)