Ich sehe in Controllern, dass $ Scope hat $ root, was ist das? Wie unterscheidet es sich von $ rootScope, das in den Controller injiziert werden kann?
Antwort
$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
Danke :) Es hilft sicherlich –
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
@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
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
:
- Wenn
$scope
ist die Wurzel, seine$root
Eigenschaft istnull
$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 ...
Das ist einer der Gründe, warum Sie nie '$ rootScope' irgendwo (zB angular-ui modals) direkt, aber verwenden Sie immer einen Kindbereich '$ rootScope. $ new();' –
Falsch. '$ root' [wird da sein] (https://github.com/angular/angular.js/blob/v1.3.6/src/ng/rootScope.js#L135) sowieso. – estus
@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
Ich bin nie über '$ Scope. $ Root' gekommen. Es kann jede benutzerdefinierte Eigenschaft sein, die auf $ scope definiert ist. – AlwaysALearner
nein ist nicht benutzerdefiniert. Sie können es in $ Bereich eines beliebigen Controllers finden –
Und eine benutzerdefinierte Eigenschaft sollte niemals mit '$' –