2014-03-06 14 views
35

Ich sehe in Controllern, dass $ Scope hat $ root, was ist das? Wie unterscheidet es sich von $ rootScope, das in den Controller injiziert werden kann?

+0

Ich bin nie über '$ Scope. $ Root' gekommen. Es kann jede benutzerdefinierte Eigenschaft sein, die auf $ scope definiert ist. – AlwaysALearner

+1

nein ist nicht benutzerdefiniert. Sie können es in $ Bereich eines beliebigen Controllers finden –

+8

Und eine benutzerdefinierte Eigenschaft sollte niemals mit '$' –

Antwort

62

$rootScope var, die auf die Eltern aller Bereiche zeigt und überall injiziert werden kann. Alle anderen Bereiche sind Kinder der $rootScope. Sie werden über die $new-Methode der $rootScope erstellt, so dass jeder Bereich von der $rootScope erbt.

In der Winkelquelle in der Definition des Scope Konstruktor there is a line:

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

Es scheint, die $root var für this des ersten Bereichs erstellt nur ein Platzhalter ist - $rootScope.

Weiter ist es this piece of code im $new Methode:

$new: function(isolate) { 
     ... 

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

So ist die $root var eines jeden Anwendungsbereich Kind $rootScope ist ein Verweis auf $rootScope. Und alle Kinder dieser Kinder den gleichen Bezug auf $rootScope

Meiner Meinung nach bekommen es besser ist, die $rootScope über Dependency Injection zu verwenden, da es eine explizite und insgesamt häufiger verwendete Weg ist, um das zu verweisen $rootScope

+0

Danke :) Es hilft sicherlich –

+6

Schöne Erklärung. Ich denke $ scope. $ Root ist da, für den einfachen Zugriff auf $ rootScope-Variablen in Templates, ohne $ rootScope in den Controller einbeziehen zu müssen. – canerbalci

+0

@canerbalci in Winkel 1.4, Root-Bereich darf zerstört werden, verwenden Sie dies. $ Root wird auf Null nach Root-Bereich zerstört werden – Jack

23

Wie bereits erwähnt, enthält $scope.$root einen Verweis auf die $rootScope.

Leider gibt es einen Unterschied zwischen $scope.$root und unter Verwendung von $rootScope:

  1. Wenn $scope ist die Wurzel, seine $root Eigenschaft ist null
  2. $scope.$root nur auf isolieren Bereiche zugeordnet: https://github.com/angular/angular.js/blob/v1.3.6/src/ng/rootScope.js#L204

Sie könnten also eine Situation haben, in der $scope.$root ist null. Bessere Verwendung $rootScope statt ...

+0

Das ist einer der Gründe, warum Sie nie '$ rootScope' irgendwo (zB angular-ui modals) direkt, aber verwenden Sie immer einen Kindbereich '$ rootScope. $ new();' –

+8

Falsch. '$ root' [wird da sein] (https://github.com/angular/angular.js/blob/v1.3.6/src/ng/rootScope.js#L135) sowieso. – estus

+0

@PetrPeller Können Sie mehr erklären oder mich zu mehr Info verweisen.Ich glaube, ich stoße auf ein Problem, das dadurch verursacht wird, dass $ rootScope in ein Modal injiziert wird. Vielen Dank. – Usagi

Verwandte Themen