Ich habe eine ListComponent. Wenn Sie in ListComponent auf ein Element klicken, sollten die Details dieses Elements in DetailComponent angezeigt werden. Beide werden gleichzeitig auf dem Bildschirm angezeigt, sodass kein Routing erforderlich ist.
Wie kann ich DetailComponent mitteilen, auf welches Element in ListComponent geklickt wurde?
Ich habe überlegt, ein Ereignis bis zum übergeordneten Element (AppComponent) auszugeben, und das übergeordnete Element hat die selectedItem.id in DetailComponent mit einem @Input festgelegt. Oder ich könnte einen gemeinsamen Dienst mit beobachtbaren Abonnements verwenden.
BEARBEITEN: Das Festlegen des ausgewählten Elements über Ereignis + @Input löst die DetailComponent jedoch nicht aus, falls ich zusätzlichen Code ausführen muss. Ich bin mir also nicht sicher, ob dies eine akzeptable Lösung ist.
Beide Methoden scheinen jedoch weitaus komplexer zu sein als die Methode von Angular 1, die entweder über $ rootScope. $ Broadcast oder $ scope. $ Parent. $ Broadcast durchgeführt wurde.
Da alles in Angular 2 eine Komponente ist, bin ich überrascht, dass es keine weiteren Informationen zur Komponentenkommunikation gibt.
Gibt es einen anderen / einfacheren Weg, dies zu erreichen?
quelle
Antworten:
Auf rc.4 aktualisiert: Wenn Sie versuchen, Daten zwischen Geschwisterkomponenten in Winkel 2 zu übertragen, besteht der derzeit einfachste Weg (angle.rc.4) darin, die hierarchische Abhängigkeitsinjektion von Winkel 2 zu nutzen und einen gemeinsamen Dienst zu erstellen.
Hier wäre der Service:
Hier wäre nun die PARENT-Komponente
und seine zwei Kinder
Kind 1
Kind 2 (Es ist Geschwister)
JETZT: Dinge, die Sie bei dieser Methode beachten sollten.
quelle
directives
sind nicht mehr in der Komponente deklariert.Bei 2 verschiedenen Komponenten (nicht verschachtelte Komponenten, Eltern \ Kind \ Enkelkind) schlage ich Folgendes vor:
quelle
Eine Möglichkeit hierfür ist die Verwendung eines gemeinsam genutzten Dienstes .
Die folgende Lösung ist jedoch viel einfacher. Sie ermöglicht den Austausch von Daten zwischen zwei Geschwistern. (Ich habe dies nur auf Angular 5 getestet. )
In Ihrer übergeordneten Komponentenvorlage:
app-sibling2.component.ts
quelle
Hier wird darüber diskutiert.
https://github.com/angular/angular.io/issues/2663
Die Antwort von Alex J ist gut, funktioniert aber ab Juli 2017 nicht mehr mit dem aktuellen Angular 4.
Und dieser Plunker-Link würde zeigen, wie man zwischen Geschwistern über Shared Service und Observable kommuniziert.
https://embed.plnkr.co/P8xCEwSKgcOg07pwDrlO/
quelle
Eine Anweisung kann in bestimmten Situationen sinnvoll sein, Komponenten zu verbinden. Tatsächlich müssen die zu verbindenden Dinge nicht einmal vollständige Komponenten sein, und manchmal ist es leichter und sogar einfacher, wenn dies nicht der Fall ist.
Zum Beispiel habe ich eine
Youtube Player
Komponente (umschließende Youtube-API) und ich wollte einige Controller-Schaltflächen dafür. Der einzige Grund, warum die Schaltflächen nicht Teil meiner Hauptkomponente sind, ist, dass sie sich an einer anderen Stelle im DOM befinden.In diesem Fall handelt es sich eigentlich nur um eine Erweiterungskomponente, die nur mit der übergeordneten Komponente von Nutzen ist. Ich sage 'Eltern', aber im DOM ist es ein Geschwister - also nenne es so, wie du willst.
Wie ich schon sagte, es muss nicht einmal eine vollständige Komponente sein, in meinem Fall ist es nur eine
<button>
(aber es könnte eine Komponente sein).Im HTML für
ProductPage.component
, woyoutube-player
ist offensichtlich meine Komponente, die die Youtube-API umschließt.Die Direktive verbindet alles für mich und ich muss das (Klick-) Ereignis nicht im HTML deklarieren.
So kann die Richtlinie eine gute Verbindung zum Videoplayer herstellen, ohne
ProductPage
als Vermittler hinzuziehen zu müssen.Dies ist das erste Mal, dass ich dies tatsächlich mache, daher noch nicht sicher, wie skalierbar es für viel komplexere Situationen sein könnte. Dafür bin ich aber glücklich und es lässt mein HTML einfach und Verantwortlichkeiten von allem verschieden.
quelle
player
. Wenn ich die erste Erwähnung des Spielers weglasse, erhalte ich einen rangeError. Ich bin ratlos, wie das funktionieren soll._player
für das private Feld verwende, das den Player darstellt. Ja, Sie würden eine Fehlermeldung erhalten, wenn Sie dies genau kopieren würden. Werde dich auf den neuesten Stand bringen. Es tut uns leid!Hier ist eine einfache praktische Erklärung: Einfach hier erklärt
In call.service.ts
Komponente, von der aus Sie Observable aufrufen möchten, um eine andere Komponente darüber zu informieren, dass auf die Schaltfläche geklickt wird
Komponente, bei der Sie eine Aktion ausführen möchten, indem Sie auf eine andere Komponente klicken
Mein Verständnis der Komponentenkommunikation ist klar, wenn ich Folgendes lese: http://musttoknow.com/angular-4-angular-5-communicate-two-components-using-observable-subject/
quelle
Shared Service ist eine gute Lösung für dieses Problem. Wenn Sie auch einige Aktivitätsinformationen speichern möchten, können Sie Shared Service zu Ihrer Anbieterliste für Hauptmodule (app.module) hinzufügen.
Dann können Sie es direkt Ihren Komponenten zur Verfügung stellen,
Mit Shared Service können Sie entweder Funktionen verwenden oder einen Betreff erstellen, um mehrere Stellen gleichzeitig zu aktualisieren.
In Ihrer Listenkomponente können Sie angeklickte Elementinformationen veröffentlichen.
und dann können Sie diese Informationen an Ihrer Detailkomponente abrufen:
Offensichtlich können die Daten, die Komponentenfreigaben auflisten, alles sein. Hoffe das hilft.
quelle
Sie müssen die Eltern-Kind-Beziehung zwischen Ihren Komponenten einrichten. Das Problem ist, dass Sie die untergeordneten Komponenten einfach in den Konstruktor der übergeordneten Komponente einfügen und in einer lokalen Variablen speichern können. Stattdessen sollten Sie die untergeordneten Komponenten in Ihrer übergeordneten Komponente mithilfe des
@ViewChild
Eigenschaftsdeklarators deklarieren . So sollte Ihre übergeordnete Komponente aussehen:https://angular.io/docs/ts/latest/api/core/index/ViewChild-var.html
https://angular.io/docs/ts/latest/cookbook/component-communication.html#parent-to-view-child
Beachten Sie, dass die untergeordnete Komponente im Konstruktor der übergeordneten Komponente nicht verfügbar ist, unmittelbar nachdem der
ngAfterViewInit
Lifecycle-Hook aufgerufen wurde. Um diesen Haken zu fangen, implementierenAfterViewInit
Sie einfach die Schnittstelle in Ihrer übergeordneten Klasse auf die gleiche Weise, wie Sie es tun würdenOnInit
.Es gibt jedoch auch andere Eigenschaftsdeklaratoren, die in diesem Blog-Hinweis erläutert werden: http://blog.mgechev.com/2016/01/23/angular2-viewchildren-contentchildren-difference-viewproviders/
quelle
Verhaltensthemen. Ich habe einen Blog darüber geschrieben.
In diesem Beispiel deklariere ich ein Noid-Verhalten mit der Typennummer. Auch ist es ein beobachtbares. Und wenn "etwas passiert ist", ändert sich dies mit der Funktion new () {}.
In den Komponenten des Geschwisters ruft einer die Funktion auf, um die Änderung vorzunehmen, und der andere wird von dieser Änderung betroffen sein oder umgekehrt.
Zum Beispiel erhalte ich die ID von der URL und aktualisiere die Noid vom Verhaltensthema.
Und von der anderen Seite kann ich fragen, ob diese ID "was immer ich will" ist und danach eine Auswahl treffen. In meinem Fall, wenn ich eine Aufgabe löschen möchte und diese Aufgabe die aktuelle URL ist, muss sie mich umleiten nach Hause:
quelle
Dies ist nicht genau das, was Sie wollen, aber es wird Ihnen sicherlich helfen
Ich bin überrascht, dass es keine weiteren Informationen zur Komponentenkommunikation gibt. <=> Betrachten Sie dieses Tutorial von angualr2
Für die Kommunikation mit Geschwisterkomponenten würde ich empfehlen, mit zu gehen
sharedService
. Es gibt jedoch auch andere Optionen.Weitere Informationen finden Sie unter dem Link oben.
Bearbeiten: Dies ist eine sehr kleine Demo. Sie haben bereits erwähnt, dass Sie es bereits versucht haben
sharedService
. Weitere Informationen finden Sie in diesem Tutorial von angualr2 .quelle
Ich habe Setter-Methoden vom übergeordneten Element über eine Bindung an eines ihrer untergeordneten Elemente weitergegeben und diese Methode mit den Daten der untergeordneten Komponente aufgerufen. Dies bedeutet, dass die übergeordnete Komponente aktualisiert wird und dann ihre zweite untergeordnete Komponente mit den neuen Daten aktualisieren kann. Es erfordert jedoch das Binden von 'this' oder die Verwendung einer Pfeilfunktion.
Dies hat den Vorteil, dass die Kinder nicht so miteinander verbunden sind, dass sie keinen bestimmten gemeinsamen Dienst benötigen.
Ich bin mir nicht ganz sicher, ob dies die beste Vorgehensweise ist. Es wäre interessant, andere Ansichten dazu zu hören.
quelle