$rootScope 和 $rootScope.$root 之间有什么区别吗?
和有什么区别
$rootScope.global.flag = true 和 $rootScope.$root.global.flag = true
他们都访问 rootscope 中的同一个变量吗?
如果是这样,是否有任何特殊情况我们必须使用它们中的任何一个?
$rootScope 和 $rootScope.$root 之间有什么区别吗?
和有什么区别
$rootScope.global.flag = true 和 $rootScope.$root.global.flag = true
他们都访问 rootscope 中的同一个变量吗?
如果是这样,是否有任何特殊情况我们必须使用它们中的任何一个?
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
对于孤立的作用域将是空的(因为它没有父作用域)。