[英]Why does this result in inheritance?
我正在阅读有关AngularJS中的作用域继承的文章 ,并对以下代码示例感到困惑:
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
那么他们自然可以访问到各种$scope
实例。
这个准确吗?
所有作用域都添加到$rootScope
对象上。 如果在$rootScope
上添加一个属性(例如someProperty),并尝试使用$scope.someProperty
访问它,则将检查该属性在$scope
上是否存在(即当前范围)。 如果该属性不存在,则将在作用域链的更高级别(即$rootScope
)对其进行检查。
ng-controller
将创建一个new Scope
。
该作用域的原型设置parent Scope
(即本例中的$rootScope
)
如果在对象中找不到我们要查找的属性,那么这是默认的JavaScript行为,它会在原型链中进行查找。
它已设置为原型,请尝试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
据我所知,在AngularJs中,作用域是从父作用域( 所有变量)继承的 ,但是如果u有同级作用域,则这些值将不会被继承。 广播是为事件完成的。
因此,Angular正在按需工作。 如果您在$ rootScope上设置了一些变量,则该变量在整个App中均可使用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.