2016-01-12 18 views
6

è possibile emettere un evento personalizzato su ngOnDestroy? Ho provato, ma sembra che non funzioni ... Fondamentalmente ho bisogno di sapere quando una direttiva viene rimossa dall'interfaccia utente.Angular2 ngOnDestroy, emit evento

@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); 
} 

risposta

10

Penso che si potrebbe usare un EventEmitter definita in un servizio anziché all'interno del componente stesso. In questo modo, il tuo componente sfrutterà questo attributo del servizio per emettere l'evento.

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'); 
    } 
} 

Altri elementi/componenti possono sottoscrivere su questo EventEmitter da notificare:

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

Spero che ti aiuta, Thierry

+0

ringrazio molto Thierry! Ho ancora una domanda: ho creato un servizio con un paio di emettitori di eventi in questo modo: 'tableViewOnInitEvent = new EventEmitter();' ecc. È possibile impostare quegli emettitori su "subscribe only/read only"? Non voglio chiamare gli emettitori direttamente tramite il servizio ma voglio chiamare l'emettitore da una funzione all'interno del Servizio, come questo: (Servizio interno): 'publicViewViewInnn (tableView) { \t \t this.tableViewOnInitEvent.next ({ \t \t \t tableView: tableView \t \t}); \t} 'Grazie :) –

+0

Un servizio è una buona soluzione. Se hai bisogno di una soluzione ad hoc puoi iscriverti manualmente (e annullare l'iscrizione) Vedere http://stackoverflow.com/questions/37609758/angular2-component-impossible-to-emit-an-output-eventemitter-inside-ngondestro?lq = 1 per ulteriori dettagli sulla spiegazione –

+0

Un servizio di notifica è un bus globale, avresti comunque bisogno di un modo per filtrare solo gli elementi che ti interessano passando a questo approccio, dove un 'EventEmitter' può contenere i suoi eventi in una gerarchia –