2016-01-12 29 views
6

क्या ngOnDestroy पर एक कस्टम घटना को उत्सर्जित करना संभव है? मैंने कोशिश की, लेकिन ऐसा लगता है कि यह काम नहीं करता है ... मुझे मूल रूप से यह जानने की जरूरत है कि यूआई से निर्देश हटा दिया गया है।कोणीय 2 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 एक सेवा के बजाय घटक के भीतर ही परिभाषित इस्तेमाल कर सकते हैं कि। इस तरह, आपका घटक घटना को उत्सर्जित करने के लिए सेवा की इस विशेषता का लाभ उठाएगा।

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

अन्य तत्वों/घटकों इस EventEmitter पर सदस्यता ले सकते हैं अधिसूचित करने के लिए किया जा:

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

आशा है कि यह आप में मदद करता है, थियरी

+0

आपको बहुत बहुत धन्यवाद थियरी! मुझे आपके लिए एक और सवाल मिला है: मैंने कुछ इवेंट उत्सर्जकों के साथ एक सेवा बनाई है: 'tableViewOnInitEvent = new EventEmitter(); 'आदि। क्या उन उत्सर्जकों को" केवल सदस्यता/केवल पढ़ने "के लिए सेट करना संभव है? मैं सीधे सेवा के माध्यम से उत्सर्जकों को कॉल नहीं करना चाहता हूं, लेकिन मैं सेवा के अंदर एक फ़ंक्शन से एमिटर को कॉल करना चाहता हूं: (सेवा के अंदर): 'सार्वजनिक तालिका दृश्यवृत्त (तालिका दृश्य) { \t 0.tयह.tableViewOnInitEvent.next ({ \t \t \t तालिका दृश्य: तालिका दृश्य \t \t}); \t} 'धन्यवाद :) –

+0

एक सेवा एक अच्छा समाधान है। यदि आपको विज्ञापन-समाधान समाधान की आवश्यकता है तो आप मैन्युअल रूप से सदस्यता ले सकते हैं (और सदस्यता समाप्त कर सकते हैं) देखें http://stackoverflow.com/questions/37609758/angular2-component-impossible-to-emit-an-output-eventemitter-inside-ngondestro?lq = 1 अधिक जानकारी स्पष्टीकरण के लिए –

+0

एक अधिसूचना सेवा एक वैश्विक बस है, फिर भी आपको इस दृष्टिकोण पर स्विच करके केवल उन तत्वों के लिए फ़िल्टर करने का एक तरीका चाहिए, जहां 'EventEmitter' में अपनी घटनाओं को पदानुक्रम में शामिल किया जा सकता है –

संबंधित मुद्दे