2014-03-06 23 views
35

我在控制器中看到$ scope有$ root,這是什麼?它與$ rootScope可以注入控制器有何不同?

+0

我從來沒有來過'$ scope。$ root'。它可以是'$ scope'上定義的任何用戶定義的屬性。 – AlwaysALearner

+1

禁止其用戶定義。你可以在任何控制器的$範圍內找到它 –

+8

而用戶定義的屬性不應該以'$' –

回答

62

$rootScope var指向所有作用域的父項,並且可以隨處注入。所有其他範圍都是$rootScope的子女。它們通過$rootScope$new方法創建,因此每個範圍都從$rootScope繼承。

Scope構造there is a line的定義的角源:

function Scope() { 
    this.$id = nextUid(); 
... 
this['this'] = this.$root = this; 
... 

看來$root變種是隻爲創建的第一個範圍的this的佔位符 - $rootScope

接下來是在$new方法this piece of code

$new: function(isolate) { 
     ... 

    if (isolate) { 
     child = new Scope(); 
     child.$root = this.$root; 
    ... 
    return child; 

所以$root變種$rootScope每範圍的孩子是$rootScope參考。而這些孩子的所有的孩子將得到相同的參考$rootScope

在我看來,這是更好地通過依賴注入使用$rootScope因爲它是一個明確的,指的是$rootScope

+0

謝謝:)它肯定會幫助 –

+6

很好的解釋。我認爲$ scope。$ root是存在的,可以方便地訪問模板中的$ rootScope變量,而不需要將$ rootScope包含到控制器中。 – canerbalci

+0

@canerbalci在角1.4中,根作用域被允許銷燬,使用它$ root root將在根作用域被銷燬後指向空 – Jack

23
的整體更爲常用的方式

如前所述,$scope.$root保留對$rootScope的引用。

不幸的是,使用$scope.$root和使用$rootScope之間的差:

  1. $scope是根,其$root屬性是null
  2. $scope.$root僅被分配於分離物的範圍: https://github.com/angular/angular.js/blob/v1.3.6/src/ng/rootScope.js#L204

所以你可能有一個情況,其中$scope.$rootnull。 更好地使用$rootScope改爲...

+0

這就是你永遠不應該在某處傳遞'$ rootScope'的原因之一(例如angular-ui modals),但總是使用一個子範圍'$ rootScope。$ new();' –

+8

錯誤。 '$ root' [會在那裏](https://github.com/angular/angular.js/blob/v1.3.6/src/ng/rootScope.js#L135)。 – estus

+0

@PetrPeller你可以解釋更多或指導我更多的信息。我認爲我遇到了一個由$ rootScope注入模式引起的問題。謝謝。 – Usagi

相關問題