2015-03-02 63 views
1

我在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然後他們自然可以訪問各種$scope實例。

這是準確的嗎?

回答

0

它被設置爲原型,嘗試CONSOLE.LOG

$scope.__proto__.rootyThing 

,你應該看到它在那裏。

此外,對象是通過在javascript參考所以它不事關時$範圍設定 例如

//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 
1

所有作用域上$rootScope對象添加。如果您在$rootScope上添加了一個屬性(例如someProperty),並且您嘗試使用$scope.someProperty訪問該屬性,則會檢查該屬性是否存在於$scope(即當前範圍)中。如果該屬性不存在,則將在範圍鏈中的較高級別上進行檢查(即$rootScope)。

0

在AngularJs,據我所知,範圍是從父作用域繼承,所有的變量,但如果u有一個同胞範圍那麼這些值不會被繼承。廣播是爲事件完成的。

所以,Angular的工作原理是一樣的。如果你已經在$ rootScope上設置了一些可以在整個App中訪問的變量。

1

ng-controller將創建一個new Scope

這個示波器的原型被設置爲parent Scope(即,e,$rootScope在這種情況下)

而這是默認的JavaScript行爲,看在原型鏈如果我們正在尋找的屬性沒有在對象中找到。

Scope inheritance

相關問題