Wenn ich folgende Controller habe:
function parent($scope, service) {
$scope.a = 'foo';
$scope.save = function() {
service.save({
a: $scope.a,
b: $scope.b
});
}
}
function child($scope) {
$scope.b = 'bar';
}
Was ist der richtige Weg zu lassen , parent
lesen b
von aus child
? Wenn es notwendig ist , zu definieren , b
in parent
, würde nicht das macht es semantisch falsch davon aus, dass b
eine Eigenschaft ist , die etwas im Zusammenhang mit beschrieben child
und nicht parent
?
Update: Wenn mehr als ein Kind darüber b
nachdenken würde, würde dies zu einem Konflikt führen, für parent
den b
es abgerufen werden könnte. Meine Frage bleibt, was ist der richtige Weg , um den Zugang b
von parent
?
Antworten:
Bereiche in AngularJS verwenden die prototypische Vererbung. Wenn Sie eine Eigenschaft in einem untergeordneten Bereich suchen, sucht der Interpreter die Prototypkette ausgehend vom untergeordneten Element und fährt mit den Eltern fort, bis die Eigenschaft gefunden wird, und nicht umgekehrt.
Überprüfen Sie die Kommentare von Vojta zum Problem https://groups.google.com/d/msg/angular/LDNz_TQQiNE/ygYrSvdI0A0J
Kurz gesagt: Sie können nicht über einen übergeordneten Bereich auf untergeordnete Bereiche zugreifen.
Ihre Lösungen:
$emit
Sendet Ereignisse nach oben an die Eltern, bis der Stammbereich erreicht ist, und sendet Ereignisse nach$broadcast
unten. Dies kann Ihnen helfen, die Dinge semantisch korrekt zu halten.quelle
localStorage
mit einer Abhängigkeit wie seinngStorage
.Während die Antwort von jm-s der beste Weg ist, um diesen Fall zu behandeln, ist es zum späteren Nachschlagen möglich, mit den Mitgliedern $$ childHead, $$ childTail, $$ nextSibling und $$ prevSibling auf untergeordnete Bereiche zuzugreifen. Diese sind nicht dokumentiert, sodass sie sich möglicherweise ohne vorherige Ankündigung ändern. Sie sind jedoch vorhanden, wenn Sie wirklich Bereiche durchlaufen müssen.
Geige
quelle
Sie können dies versuchen:
Fügen Sie dann im untergeordneten Controller (Bereich) Folgendes hinzu:
Jetzt hat der Elternteil Zugriff auf den Bereich des Kindes.
quelle
Eine mögliche Problemumgehung besteht darin, den untergeordneten Controller mithilfe einer Init-Funktion in den übergeordneten Controller einzufügen.
Mögliche Implementierung:
Wo in
ChildController
dir hast:So, jetzt in der können
ParentController
Sie verwenden:Wichtig:
Um richtig zu funktionieren, müssen Sie die Direktive verwenden
ng-controller
und jeden Controller umbenennen,as
wie ich es im HTML getan habe, z.Tipps:
Verwenden Sie während des Vorgangs den Chrome Plugin ng-Inspector . Es wird Ihnen helfen, den Baum zu verstehen.
quelle
Verwenden von $ emit und $ Broadcast (wie von walv in den obigen Kommentaren erwähnt)
Ein Ereignis nach oben auslösen (vom Kind zum Elternteil)
Ein Ereignis nach unten auslösen (vom Elternteil zum Kind)
und schließlich zuzuhören
Für weitere Informationen: - https://toddmotto.com/all-about-angulars-emit-broadcast-on-publish-subscribing/
Genießen :)
quelle
Ja, wir können den Variablen im übergeordneten Controller Variablen vom untergeordneten Controller zuweisen. Dies ist ein möglicher Weg:
Übersicht: Das Hauptziel des folgenden Codes besteht darin, die $ scope.variable des untergeordneten Controllers der $ scope.assign des übergeordneten Controllers zuzuweisen
Erläuterung: Es gibt zwei Controller. Beachten Sie im HTML, dass der übergeordnete Controller den untergeordneten Controller einschließt. Das heißt, der übergeordnete Controller wird vor dem untergeordneten Controller ausgeführt. Also wird zuerst setValue () definiert und dann geht das Steuerelement zum untergeordneten Controller. $ scope.variable wird als "Kind" zugewiesen. Dann wird dieser untergeordnete Bereich als Argument an die Funktion des übergeordneten Controllers übergeben, wobei $ scope.assign den Wert "child" erhält.
quelle