簡體   English   中英

為什么會導致繼承?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM