$rootScope 和 $rootScope.$root 的区别

Difference between $rootScope and $rootScope.$root

$rootScope和$rootScope.$root有区别吗?

有什么区别

$rootScope.global.flag = true 和 $rootScope.$root.global.flag = true

他们都访问根作用域中的同一个变量吗?

如果是这样,是否有任何特定情况我们必须使用它们中的任何一个?

Angular 中的所有作用域都是同一原型的实例。因此,全局服务 $rootScope 是为指令创建并传递给 $scope 函数或控制器的相同类型的对象。

属性 $root 是该原型的一部分,适用于所有范围。

$rootScope 是 Angular 创建的第一个作用域。所有范围都是使用现有范围的 $new 方法创建的。所以 $rootScope 是一个特例,因为它是在模块上执行 angular.run() 之前创建的。

当您检查 $scope.$root 的值时,它引用了根作用域服务为 $rootScope 提供的同一个实例。

因此;

console.log($rootScope === $scope.$root); // will print true

或者像你的例子一样;

console.log($rootScope === $rootScope.$root); // will also print true

是的,无论您如何引用根作用域,根作用域中的变量都是相同的。

console.log($rootScope.global.flag); // prints true
console.log($scope.$root.global.flag); // prints true
console.log($rootScope.$root.global.flag); // prints true

您也可以像这样在模板表达式中显式访问根作用域。

<div>{{$root.someValue}}</div>

还有其他属性,例如 $parent,可让您沿着作用域链向上移动,但 $parent 对于独立作用域而言将为 null(因为它没有父级)。