Ich habe zwei Komponenten wie folgt und möchte eine Funktion von einer anderen Komponente aufrufen. Beide Komponenten werden mithilfe der Direktive in die dritte übergeordnete Komponente aufgenommen.
Komponente 1:
@component(
selector:'com1'
)
export class com1{
function1(){...}
}
Komponente 2:
@component(
selector:'com2'
)
export class com2{
function2(){...
// i want to call function 1 from com1 here
}
}
Ich habe es versucht @input
und @output
aber ich verstehe nicht genau, wie man es benutzt und wie man diese Funktion aufruft. Kann mir jemand helfen?
angular
angular2-components
noobProgrammer
quelle
quelle
Antworten:
Wenn com1 und com2 Geschwister sind, können Sie verwenden
com2 gibt ein Ereignis mit einem aus
EventEmitter
Hier fügt die übergeordnete Komponente eine Ereignisbindung hinzu, um
myEvent
Ereignisse abzuhören, und ruft dann auf,com1.function1()
wenn ein solches Ereignis eintritt.#com1
ist eine Vorlagenvariable, mit der auf dieses Element von einer anderen Stelle in der Vorlage verwiesen werden kann. Wir nutzen dies , umfunction1()
für die Event - HandlermyEvent
voncom2
:Weitere Optionen für die Kommunikation zwischen Komponenten finden Sie unter Komponenteninteraktion
quelle
<sibling1 (myEvent)="...">
ist eine Ereignisbindung für das übergeordnete Element / den Host, da Angular nur so eine Möglichkeit bietet. Der Ereignishandler ruft jedoch eine Methode für das andere sibling (com1
) auf. Der Elternteil wird als Vermittler eingesetzt.somecomponent.ts
?Zunächst, was Sie benötigen, um die Beziehungen zwischen Komponenten zu verstehen. Dann können Sie die richtige Kommunikationsmethode wählen. Ich werde versuchen, alle Methoden zu erklären, die ich kenne und in meiner Praxis für die Kommunikation zwischen Komponenten verwende.
Welche Arten von Beziehungen zwischen Komponenten kann es geben?
1. Eltern> Kind
Daten über Eingabe teilen
Dies ist wahrscheinlich die häufigste Methode zum Teilen von Daten. Mithilfe des
@Input()
Dekorators können Daten über die Vorlage übertragen werden.parent.component.ts
child.component.ts
Dies ist eine sehr einfache Methode. Es ist einfach zu bedienen. Mit ngOnChanges können wir auch Änderungen an den Daten in der untergeordneten Komponente abfangen .
Vergessen Sie jedoch nicht, dass sich der Verweis darauf nicht ändert, wenn wir ein Objekt als Daten verwenden und die Parameter dieses Objekts ändern. Wenn wir also ein geändertes Objekt in einer untergeordneten Komponente empfangen möchten, muss es unveränderlich sein.
2. Kind> Eltern
Daten über ViewChild teilen
Mit ViewChild kann eine Komponente in eine andere eingefügt werden, sodass der übergeordnete Benutzer Zugriff auf seine Attribute und Funktionen erhält . Eine Einschränkung ist jedoch, dass
child
diese erst verfügbar ist, nachdem die Ansicht initialisiert wurde. Dies bedeutet, dass wir den AfterViewInit-Lebenszyklus-Hook implementieren müssen, um die Daten vom untergeordneten Element zu empfangen.parent.component.ts
child.component.ts
Daten über Output () und EventEmitter austauschen
Eine andere Möglichkeit, Daten gemeinsam zu nutzen, besteht darin, Daten vom untergeordneten Element auszugeben, die vom übergeordneten Element aufgelistet werden können. Dieser Ansatz ist ideal, wenn Sie Datenänderungen freigeben möchten, die beispielsweise bei Schaltflächenklicks, Formulareinträgen und anderen Benutzerereignissen auftreten.
parent.component.ts
child.component.ts
3. Geschwister
Kind> Eltern> Kind
Ich versuche unten andere Möglichkeiten der Kommunikation zwischen Geschwistern zu erklären. Sie können jedoch bereits eine der Möglichkeiten zum Verständnis der oben genannten Methoden verstehen.
parent.component.ts
child-one.component.ts
child-two.component.ts
4. Nicht verwandte Komponenten
Alle Methoden, die ich unten beschrieben habe, können für alle oben genannten Optionen für die Beziehung zwischen den Komponenten verwendet werden. Aber jeder hat seine eigenen Vor- und Nachteile.
Daten mit einem Dienst teilen
Wenn Sie Daten zwischen Komponenten übertragen, für die keine direkte Verbindung besteht, z. B. Geschwister, Enkelkinder usw., sollten Sie einen gemeinsam genutzten Dienst verwenden. Wenn Sie Daten haben, die immer synchron sein sollten, finde ich das RxJS BehaviorSubject in dieser Situation sehr nützlich.
data.service.ts
first.component.ts
second.component.ts
Daten mit einer Route teilen
Manchmal müssen Sie nicht nur einfache Daten zwischen Komponenten übertragen, sondern auch einen bestimmten Status der Seite speichern. Zum Beispiel möchten wir einige Filter im Online-Markt speichern und dann diesen Link kopieren und an einen Freund senden. Und wir erwarten, dass die Seite im selben Zustand wie wir geöffnet wird. Der erste und wahrscheinlich schnellste Weg, dies zu tun, wäre die Verwendung von Abfrageparametern .
Abfrageparameter sehen eher so aus,
/people?id=
alsid
ob alles gleich wäre, und Sie können so viele Parameter haben, wie Sie möchten. Die Abfrageparameter würden durch das kaufmännische Und-Zeichen getrennt.Wenn Sie mit Abfrageparametern arbeiten, müssen Sie diese nicht in Ihrer Routendatei definieren, und sie können als Parameter bezeichnet werden. Nehmen Sie zum Beispiel den folgenden Code:
page1.component.ts
Auf der Empfangsseite würden Sie diese Abfrageparameter wie folgt erhalten:
page2.component.ts
NgRx
Der letzte Weg, der komplizierter, aber leistungsfähiger ist, ist die Verwendung von NgRx . Diese Bibliothek ist nicht für die gemeinsame Nutzung von Daten vorgesehen. Es ist eine leistungsstarke State-Management-Bibliothek. Ich kann nicht in einem kurzen Beispiel erklären, wie man es benutzt, aber Sie können auf die offizielle Seite gehen und die Dokumentation darüber lesen.
Für mich löst NgRx Store mehrere Probleme. Wenn Sie sich beispielsweise mit Observablen befassen müssen und die Verantwortung für einige beobachtbare Daten auf verschiedene Komponenten aufgeteilt ist, stellen die Speicheraktionen und der Reduzierer sicher, dass Datenänderungen immer "auf die richtige Weise" durchgeführt werden.
Es bietet auch eine zuverlässige Lösung für das Zwischenspeichern von HTTP-Anforderungen. Sie können die Anforderungen und ihre Antworten speichern, um zu überprüfen, ob für die von Ihnen gestellte Anforderung noch keine Antwort gespeichert ist.
Sie können über NgRx lesen und verstehen, ob Sie es in Ihrer App benötigen oder nicht:
Abschließend möchte ich sagen, dass Sie vor der Auswahl einiger Methoden zum Teilen von Daten verstehen müssen, wie diese Daten in Zukunft verwendet werden. Ich meine, vielleicht können Sie gerade jetzt nur einen
@Input
Dekorateur verwenden, um einen Benutzernamen und einen Nachnamen zu teilen. Anschließend fügen Sie eine neue Komponente oder ein neues Modul hinzu (z. B. ein Admin-Bereich), das weitere Informationen zum Benutzer benötigt. Dies bedeutet, dass dies möglicherweise eine bessere Möglichkeit ist, einen Dienst für Benutzerdaten zu verwenden oder Daten auf andere Weise gemeinsam zu nutzen. Sie müssen mehr darüber nachdenken, bevor Sie mit der Implementierung der Datenfreigabe beginnen.quelle
Sie können von Komponente 2 auf die Methode der Komponente 1 zugreifen.
componentOne
componentTwo
componentTwo HTML-Datei
quelle
Komponente 1 (Kind):
Komponente 2 (übergeordnet):
quelle
@ViewChild
das für mich funktioniert. Danke für dieses Beispiel.Dies hängt von der Beziehung zwischen Ihren Komponenten (Eltern / Kind) ab. Der beste / allgemeinste Weg, um Kommunikationskomponenten herzustellen, ist die Verwendung eines gemeinsam genutzten Dienstes.
Weitere Informationen finden Sie in diesem Dokument:
Davon abgesehen können Sie Folgendes verwenden, um eine Instanz von com1 in com2 bereitzustellen:
In com2 können Sie Folgendes verwenden:
quelle
@Input
auf dem Feld?<button (click)="dbgraph.displayTableGraph()">Graph</button> <dbstats-graph #dbgraph></dbstats-graph>
Beachten Sie die lokale Variable
#dbgraph
in der untergeordneten Komponente, mit der das übergeordnete Element auf seine Methoden zugreifen kann (dbgraph.displayTableGraph()
).quelle
Mit Dataservice können wir die Funktion von einer anderen Komponente aus aufrufen
Komponente1: Die Komponente, die wir die Funktion aufrufen
datenservice.ts
Komponente2: Die Komponente, die die Funktion enthält
quelle
if ( this.bookmarkRoot.callToggle.observers.length === 0 ) { this.bookmarkRoot.callToggle.subscribe(( data ) => { this.closeDrawer(); } ) }