2016-05-06 11 views
4

Man kann Output() Dekorator verwenden, um das Ereignis von der untergeordneten Komponente zu emittieren, damit die übergeordnete Komponente es fangen kann. Was ich brauche, ist ein Ereignis abzufangen, das von einer untergeordneten Komponente ausgegeben wird, die nicht unbedingt ein direktes Kind einer bestimmten Komponente ist.Emit Ereignis durch verschachtelte Komponenten in Angular2

Lassen Sie ComponentTwo eine Komponente sein, die das Ereignis ausgibt. Wenn die App die folgende Struktur hat: App -> ComponentTwo, dann können wir das von ComponentTwo ausgegebene Ereignis leicht abfangen. Aber wenn wir Struktur wie App -> ComponentOne -> ComponentTwo betrachten, können wir den Emitter nicht direkt fangen.

Hier ist eine plunker, die das Problem veranschaulicht.

Gibt es eine Möglichkeit, das Ereignis an alle übergeordneten Komponenten zu verteilen? Vielen Dank.

Antwort

11

Es gibt keine Unterstützung für Blasenbildung für solche Ereignisse. Sie müssen sie manuell abfangen und an das übergeordnete Element senden.

Ein anderer Ansatz wäre, einen geteilten Dienst für diesen Komponentenbaum zu nutzen und ein Observable/Subject darin zu verwenden.

Auf diese Weise können alle Komponenten abonniert werden, um über Ereignisse selbst innerhalb von Unter-Unter-Kindern benachrichtigt zu werden.

constructor(private service: SharedService) { 
} 

notify() { 
    this.service.notifier$.next('some data'); 
} 

diesen Link finden Sie weitere Details:

+1

Danke

constructor(private service: SharedService) { this.service.notifier$.subscribe( data => { (...) }); } 

Die Veranstaltung wird auf diese Weise ausgelöst werden. BTW ist Abwesenheit von Blasenbildung aufgrund des Designs von A2 oder einfach nicht (noch) implementiert? – nakajuice

+0

Gern geschehen! Ich denke, es ist eine Designwahl. –

Verwandte Themen