2016-01-12 15 views
6

ist es möglich, ein benutzerdefiniertes Ereignis auf ngOnDestroy zu emittieren? Ich habe es versucht, aber anscheinend funktioniert es nicht ... Ich muss im Grunde wissen, wann eine Richtlinie aus der Benutzeroberfläche entfernt wird.Angular2 ngOnDestroy, emittieren Ereignis

@Output() rowInit = new EventEmitter(); 
@Output() rowDestroy = new EventEmitter(); 

ngAfterViewInit() { 

    this.rowInit.emit(this); 
} 

ngOnDestroy() { 
    console.log("I get called, but not emit :(, ngAfterViewInit works :)"); 
    this.rowDestroy.emit(this); 
} 

Antwort

10

Ich glaube, dass Sie ein EventEmitter in einer Dienstleistung nutzen könnten, anstatt innerhalb der Komponente selbst. Auf diese Weise würde Ihre Komponente dieses Attribut des Dienstes nutzen, um das Ereignis auszugeben.

import {EventEmitter} from 'angular2/core'; 

export class NotificationService { 
    onDestroyEvent: EventEmitter<string> = new EventEmitter(); 
    constructor() {} 
} 

export class MyComponent implements OnDestroy { 
    constructor(service:NotificationService) { 
    this.service = service; 
    } 

    ngOnDestroy() { 
    this.service.onDestroyEvent.emit('component destroyed'); 
    } 
} 

Andere Elemente/Komponenten auf dieser EventEmitter abonnieren können, um benachrichtigt:

this.service.onDestroyEvent.subscribe(data => { ... }); 

Hoffe, es hilft Ihnen, Thierry

+0

Vielen Dank Thierry! Ich habe noch eine Frage an Sie: Ich habe einen Service mit einigen Event-Emittern wie folgt erstellt: 'tableViewOnInitEvent = new EventEmitter();' usw. Ist es möglich, diese Emitter auf "nur abonnieren/nur lesen" zu setzen? Ich möchte die Emitter nicht direkt über den Dienst aufrufen, aber ich möchte den Emitter von einer Funktion innerhalb des Service aufrufen, wie folgt: (public tableViewOnInit (tableView)) { \t \t this.tableViewOnInitEvent.next ({ \t \t \t TableView: TableView \t \t}); \t} 'Danke :) –

+0

Ein Service ist eine gute Lösung. Wenn Sie Ad-hoc-Lösung benötigen, können Sie manuell abonnieren (und abmelden) Siehe http://stackoverflow.com/questions/37609758/angular2-component-impossible-to-emit-an-output-eventemitter-inside-ngondestro?lq = 1 für weitere Details Erklärung –

+0

Ein Benachrichtigungsdienst ist ein globaler Bus, Sie müssten immer noch nur nach den Elementen filtern, die Sie interessieren, indem Sie zu diesem Ansatz wechseln, wobei ein 'EventEmitter' seine Ereignisse in einer Hierarchie enthalten kann –

Verwandte Themen