2016-01-12 6 views
6

を発行すると、ngOnDestroyでカスタムイベントを発行できますか?私は試してみましたが、うまくいかないようです...基本的に指示がUIから削除されたときを知る必要があります。Angular2 ngOnDestroy、イベント

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

答えて

10

EventEmitterは、コンポーネント自体ではなくサービスで定義されていると思います。このようにして、コンポーネントはサービスのこの属性を利用してイベントを発行します。

他の要素/コンポーネントが通知されるように、この持つEventEmitterで購読することができます

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

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

が、それはあなたのお役に立てば幸い、 ティエリー

+0

は非常に多くのティエリーありがとうございます!私はあなたにもう1つの質問があります: 'tableViewOnInitEvent = new EventEmitter();'のようないくつかのイベントエミッタを持つサービスを作成しました。それらのエミッタを「購読専用/読み込み専用」に設定することは可能ですか?私はエミッタをサービスから直接呼びたくはありませんが、次のように、サービス内の関数からエミッタを呼び出す必要があります。(内部サービス):public tableViewOnInit(tableView){ \t \t this.tableViewOnInitEvent.next ({ \t \t \t tableView:tableView \t \t}); \t} 'ありがとう:) –

+0

サービスは良い解決策です。アドホックなソリューションが必要な場合は、手動で登録(および登録解除)することができます http://stackoverflow.com/questions/37609758/angular2-component-impossible-to-emit-an-output-eventemitter-inside-ngondestro?lq = 1詳細の説明については –

+0

通知サービスはグローバルバスですが、このアプローチに切り替えることで気にする要素だけをフィルタリングする方法が必要です。ここで、 'EventEmitter'には階層へのイベントを含めることができます –

関連する問題