我正在阅读AngularJS中范围继承的this article,并对此代码示例感到困惑:
angular.module("Demo", [])
.controller("ChildCtrl", function($rootScope, $scope) {
$rootScope.rootyThing = "I am groot";
console.log($scope.rootyThing); // "I am groot"
console.log(Object.getPrototypeOf($scope)); // Scope
});
我不明白为什么设置$scope.rootyThing
而不是undefined
。
文章的解释似乎不完整。儿童范围"原型继承"来自$rootScope
的人不会解释这一点,因为原型上没有设置rootyThing
,而且在创建子范围$scope
之后设置了它。
唯一的解释是,Angular中的范围是否经过深度修改,以便在其上设置的所有变量都广播到现有的子范围。除非我错过了一些东西,否则就超过了。
任何人都能解释一下吗?
修改:我目前的理解是$rootScope
实际上是Scope
函数本身而不是实例 Scope
,并且所有$scope
个实例都将此作为根原型使用,因此当在函数Scope
上设置变量时,它们可以自然地被各种{{1}访问实例。
这准确吗?
答案 0 :(得分:1)
所有范围都添加在$rootScope
对象上。如果在$rootScope
上添加属性(例如someProperty)并尝试使用$scope.someProperty
访问它,则会检查$scope
上是否存在此属性(即当前范围)。如果该属性不存在,则将在范围链的更高级别检查(即$rootScope
)。
答案 1 :(得分:1)
ng-controller
将创建new Scope
。
此范围的原型设置为parent Scope
(即,在这种情况下为$rootScope
)
如果在对象中找不到我们要查找的属性,那么它是原型链中的默认javascript行为。
答案 2 :(得分:0)
设置为原型,尝试console.log
$scope.__proto__.rootyThing
你应该在那里看到它。
此外,对象在javascript中引用,因此在设置$ scope时无关紧要 例如
//say this is your rootScope
objRoot = {
obj: {
test: 'hello'
}
}
//Now lets create a scope
var temp = objRoot.obj
//Update rootScope
objRoot.obj.test = "changed"
//log your temp
console.log(temp.test); //changed
答案 3 :(得分:0)
在AngularJs中,据我所知,范围是从父范围继承的,所有变量,但是如果你有兄弟范围那么这些值将会不被继承。广播是为了举办活动。
因此,Angular正在发挥作用。如果您在$ rootScope上设置了一些可在整个App中访问的变量。