2016-05-04 20 views
1

Kann ich ein Ereignis, das von einer Blattkomponente ausgegeben wird, nur in der Stammkomponente abfangen? Ich habe dazu keine Informationen gefunden.Angular 2 Event Emitter?

Antwort

1

In der Tat können Sie nur bei einem benutzerdefinierten Ereignis von einer untergeordneten Komponente in der übergeordneten Komponente benachrichtigt werden.

Um Ihren Anwendungsfall zu implementieren, müssen Sie einen freigegebenen Dienst implementieren, den Sie in derAttribut in Ihrer Stammkomponente angeben. Auf diese Weise wird es mit dieser Komponente und dem gesamten Graphen seiner Kinder geteilt.

Dieser Service enthält ein beobachtbares Thema. Wenn ein Blatt ein Ereignis auslösen möchte, wird es den Beobachter, der mit diesem Observablen oder dem Subjekt assoziiert ist, nutzen. Die Root-Komponente abonniert diese beobachtbare/zu benachrichtigende Subject

Hier ist eine Beispielimplementierung. Zunächst wird der Service:

export class EventService { 
    subject$: Subject<any> = new Subject(); 
} 

Root-Komponente:

@Component({ 
    (...) 
    providers: [ EventService ] 
    (...) 
}) 
export class RootComponent { 
    constructor(private service:EventService) { 
    this.eventService.subject$.subscribe(event => { 
     // Execute when the event is received from leaf component 
    }); 
    } 
} 

Blatt Komponente:

@Component({ 
    (...) 
    template: ` 
    <div (click)="emitEventToRoot()">Emit event</div> 
    ` 
}) 
export class LeafComponent { 
    constructor(private service:EventService) { 
    } 

    emitEventToRoot() { 
    // Send the event to the root component 
    this.eventService.subject$.emit('some event'); 
    } 
} 

Diese Links könnten Sie interessieren: