[英]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.