Kann jemand den Unterschied zwischen $ scope und $ rootScope erklären?
Meiner Ansicht nach
$ scope:
Auf diese Weise können wir ng-Modelleigenschaften in einem bestimmten Controller von der jeweiligen Seite abrufen.
$ rootScope
Auf diese Weise können wir alle ng-Modelleigenschaften in jedem Controller von jeder Seite abrufen.
Ist das richtig? Oder sonst noch etwas?
javascript
angularjs
Sergio Ivanuzzo
quelle
quelle
Antworten:
"$ rootScope" ist ein übergeordnetes Objekt aller auf einer Webseite erstellten "$ scope" -Winkelobjekte.
$ scope wird mit erstellt,
ng-controller
während $ Rootscope mit erstellt wirdng-app
.quelle
Der Hauptunterschied ist die Verfügbarkeit der dem Objekt zugewiesenen Eigenschaft. Eine mit zugewiesene Eigenschaft
$scope
kann nicht außerhalb des Controllers verwendet werden, in dem sie definiert ist, während eine mit zugewiesene Eigenschaft verwendet werden kann$rootScope
überall verwendet werden kann.Beispiel: Wenn im Beispiel unten Sie ersetzen
$rootScope
mit$scope
der Abteilung Eigenschaft wird nicht von der ersten Steuerung in dem zweiten bestückt werdenquelle
Laut Angulars Entwicklerhandbuch für Bereiche :
quelle
$rootScope
ist global verfügbar, unabhängig davon, in welchem Controller Sie sich befinden, während$scope
es nur für den aktuellen Controller und seine untergeordneten Controller verfügbar ist.quelle
Auf andere Weise können wir dies betrachten;
$rootScope
ist global, während$scope
lokal ist. WennController
einer Seite zugewiesen wird,$scope
kann hier eine Variable verwendet werden, da sie an diesen Controller gebunden ist. Wenn wir jedoch den Wert für andere Controller oder Dienste freigeben möchten,$rootScope
wird dieser verwendet (** Es gibt alternative Möglichkeiten, wir können Werte für mehrere Benutzer freigeben, in diesem Fall möchten wir ihn jedoch verwenden$rootScope
).Ihre zweite Frage, wie Sie diese beiden Wörter definieren, ist richtig.
Zuletzt etwas abseits der Strecke, bitte vorsichtig verwenden
$rootScope
. Ähnlich wie bei der Verwendung globaler Variablen kann das Debuggen schwierig sein, und Sie können die globale Variable versehentlich irgendwo in einem Timer ändern oder etwas, das Ihre Lesung falsch macht.quelle
Jede Anwendung hat mindestens ein einziges rootScope und ihr Lebenszyklus ist der gleiche wie der der App. Jeder Controller kann seinen eigenen Bereich haben, der nicht mit anderen geteilt wird.
Schauen Sie sich diesen Artikel an:
https://github.com/angular/angular.js/wiki/Understanding-Scopes
quelle
Ich empfehle Ihnen, die offizielle ausführliche Angular-Dokumentation für Bereiche zu lesen. Beginnen Sie mit dem Abschnitt 'Umfangshierarchien':
https://docs.angularjs.org/guide/scope
Im Wesentlichen identifizieren sowohl $ rootScope als auch $ scope bestimmte Teile des DOM, in denen
Alles, was zu $ rootScope gehört, ist global in Ihrer Angular-App verfügbar, während alles, was zu einem $ scope gehört, in dem Teil des DOM verfügbar ist, für den dieser Bereich gilt.
Das $ rootScope wird auf das DOM-Element angewendet, das das Root-Element für die Angular-App ist (daher der Name $ rootScope). Wenn Sie die Anweisung ng-app zu einem Element des DOM hinzufügen, wird dies zum Stammelement des DOM, in dem $ rootScope verfügbar ist. Mit anderen Worten, Eigenschaften usw. von $ rootScope sind in Ihrer gesamten Angular-Anwendung verfügbar.
Ein Angular $ -Bereich (und alle seine Variablen und Operationen) steht einer bestimmten Teilmenge des DOM in Ihrer Anwendung zur Verfügung. Insbesondere steht der $ scope für einen bestimmten Controller für den Teil des DOM zur Verfügung, auf den dieser bestimmte Controller angewendet wurde (unter Verwendung der ng-controller-Direktive). Beachten Sie jedoch, dass bestimmte Anweisungen, z. B. ng-repeat, bei Anwendung in einem Teil des DOM, in dem der Controller angewendet wurde, untergeordnete Bereiche des Hauptbereichs erstellen können - innerhalb desselben Controllers - ein Controller enthält nicht unbedingt nur einen Bereich.
Wenn Sie sich beim Ausführen Ihrer Angular-App den generierten HTML-Code ansehen, können Sie leicht erkennen, welche DOM-Elemente einen Bereich enthalten, da Angular die Klasse ng-scope für jedes Element hinzufügt, auf das ein Bereich angewendet wurde (einschließlich des Stammelements) der App, die das $ rootScope hat).
Übrigens ist das '$'-Zeichen am Anfang von $ scope und $ rootScope einfach eine Kennung in Angular für Dinge, die von Angular reserviert wurden.
Beachten Sie, dass die Verwendung von $ rootScope zum Teilen von Variablen usw. zwischen Modulen und Controllern im Allgemeinen nicht als bewährte Methode angesehen wird. JavaScript-Entwickler sprechen davon, die Verschmutzung des globalen Bereichs durch die gemeinsame Nutzung von Variablen zu vermeiden, da es später zu Konflikten kommen kann, wenn eine gleichnamige Variable an einer anderen Stelle verwendet wird, ohne dass der Entwickler merkt, dass sie bereits im $ rootScope deklariert ist. Die Bedeutung dieser Anwendung steigt mit der Größe der Anwendung und dem Team, das sie entwickelt. Im Idealfall enthält $ rootScope nur Konstanten oder statische Variablen, die in der gesamten App jederzeit konsistent sein sollen. Eine bessere Möglichkeit, Inhalte modulübergreifend zu teilen, ist möglicherweise die Verwendung von Diensten und Fabriken, was ein weiteres Thema ist!
quelle
Beide sind Java-Skriptobjekte und der Unterschied wird durch das folgende Diagramm dargestellt.
NTB: Die
erste Winkelanwendung versucht, die Eigenschaft eines Modells oder einer Funktion in $ scope zu finden. Wenn die Eigenschaft in $ scope nicht gefunden wird, sucht sie im übergeordneten Bereich in der oberen Hierarchie. Wenn die Eigenschaft immer noch nicht in der oberen Hierarchie gefunden wird, versucht Angular, in $ Rootscope aufzulösen.
quelle
Neue Stile wie John Papas AngularJS Styleguide schlagen vor, dass wir
$scope
die Eigenschaften der aktuellen Seite überhaupt nicht speichern sollten . Stattdessen sollten wir dencontrollerAs with vm
Ansatz verwenden, bei dem die Ansicht an das Controller-Objekt selbst gebunden ist. Verwenden Sie dazu eine Capture-Variable, wenn Sie die ControllerAs-Syntax verwenden. Wählen Sie einen konsistenten Variablennamen wie vm, der für ViewModel steht.Sie benötigen das jedoch weiterhin
$scope
für die Überwachungsfunktionen.quelle