2016-01-12 25 views
6

ngOnDestroy'da özel bir etkinlik yayınlamak mümkün mü? Denedim, ama işe yaramıyor gibi görünüyor ... Temelde bir Direktifin UI'den kaldırıldığını bilmek zorundayım.Angular2 ngOnDestroy, emit olayı

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

cevap

10

Sana bir hizmette yerine bileşeni kendi içinde tanımlanan bir EventEmitter kullanabilirsiniz düşünüyorum. Bu şekilde, bileşeniniz, olayı yaymak için hizmetin bu özelliğini kullanır. Bu EventEmitter üzerinde abone olabilirsiniz

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

Diğer elementler/bileşenleri haberdar olmak için:

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

Eğer size yardımcı Umut, Thierry

+0

çok Thierry teşekkür ederiz! Size bir sorum daha var: Birkaç olay emitörüyle bir Hizmet yarattım: 'tableViewOnInitEvent = new EventEmitter();' vb. Bu yayıcıları "sadece abone/salt okunur" olarak ayarlamak mümkün mü? Yayıcıları doğrudan hizmet aracılığıyla aramak istemiyorum, ancak yayımcıyı Hizmet içindeki bir işlevden aramak istiyorum. Bunun gibi: (İç Hizmet): 'public tableViewOnInit (tablo Görünümü) { \t \t this.tableViewOnInitEvent.next ({ \t \t \t tableView \t \t}); \t} 'Teşekkürler :) –

+0

Bir Hizmet iyi bir çözümdür. Geçici bir çözüme ihtiyacınız varsa, manüel olarak abone olabilirsiniz (ve abonelikten çıkabilirsiniz) Bkz. Http://stackoverflow.com/questions/37609758/angular2-component-impossible-to-emit-an-output-eventemitter-inside-ngondestro?lq = 1 Daha fazla bilgi için açıklama –

+0

Bir bildirim servisi global bir veriyoludur, sadece bu yaklaşıma geçerek sadece önem verdiğiniz öğeleri filtrelemek için bir yönteme ihtiyaç duyarsınız, burada 'EventEmitter' olaylarını bir hiyerarşiye dahil edebilir –