2016-11-17 13 views
9

चूंकि कोई टेम्पलेट नहीं है, इसलिए निर्देश में बाल तत्वों की घटना को सुनने का सबसे अच्छा तरीका क्या है? क्या यह HostListener के साथ संभव है? यदि नहीं, तो क्या कोई और तरीका है?निर्देशों में बच्चों के तत्वों की घटनाओं को कैसे सुनें?

यह भी इसी तरह का प्रश्न है: How to listen for child event from parent directive in Angular2, लेकिन सुझाया गया दृष्टिकोण मेरी समस्या का समाधान नहीं करता है, क्योंकि मेरा निर्देश और बाल तत्व एक ही टेम्पलेट में नहीं है (निर्देश मेजबान पर है)।

चीयर्स!

# संपादित करें 1

यह कैसे मैं वर्तमान में (एक बेहतर तरीका होना करने के लिए वहाँ गया है) यह कर रहा हूँ है:

constructor(private elView: ElementRef) {} 

:

सबसे पहले मेरी निर्देश में ElementRef इंजेक्शन फिर jQuery (या सादा जेएस) के साथ बाध्यकारी:

$(this.elView.nativeElement) 
.on('drag', '#childId', this.slide.bind(this)) 
+0

मुझे यकीन है कि नहीं हूँ, लेकिन [इस] (http://orizens.com/wp/topics/angular-2-attribute-directive-creating-an -इनफिन-स्क्रॉल-निर्देश /) उपयोगी हो सकता है – ulubeyn

उत्तर

6

घटना आप सुनना चाहते हैं एक देशी डोम घटना है कि बुलबुले है, तो आप सिर्फ @HostListener()

@HostListener('click', ['$event']) 
handleClick(event) { 
    // handle event 
} 

का उपयोग वे बच्चे घटकों के आउटपुट कर रहे हैं कर सकते हैं, तो आप उन्हें क्वेरी कर सकता है और उनके outputs की सदस्यता

@ContentChildren(ChildComponent) children:QueryList<ChildComponent>; 

ngAfterContentInit() { 
    this.children.toArray().forEach((item) => { 
    item.someOutput.subscribe(...); 
    }); 
} 

या आप अपने प्रश्न से जुड़े उत्तर में उपयोग किए गए दृष्टिकोण का उपयोग कर सकते हैं।

+0

आपके उत्तर के लिए धन्यवाद। 'होस्ट लिस्टनर' बुलेटप्रूफ पर्याप्त नहीं है, क्योंकि 'स्टॉपप्रॉपैगेशन' के कारण कई घटनाएं प्रचारित नहीं होंगी। मैं ऐसा कुछ करने की उम्मीद कर रहा था जो मुझे सीधे बच्चे के तत्व से बांधने की अनुमति दे। – maximedupre

+0

यही है कि @ @ContentChildren() 'या अन्य उत्तर, एक साझा सेवा में भी सुझाव दिया गया है। –

+0

उन दो तकनीकों का काम नहीं होगा, क्योंकि मैं जरूरी नहीं है कि घटकों द्वारा शुरू की गई घटनाओं को सुनें। मैं भी (ज्यादातर) डीओएम घटनाओं को सुनना चाहता हूं जिन्हें "सामान्य" तत्वों द्वारा शुरू किया गया था। – maximedupre

1

आप अपने घटकों को सेवा-कक्षा के माध्यम से एक-दूसरे के साथ संवाद करने पर विचार कर सकते हैं।

// service class 
class Service { 
    private someEventSource = new Subject(); 
    public someEvent = this.someEventSource.asObservable(); 

    public invokeAnEvent (data: string) { 
    this.someEventSource.next(data); 
    } 
} 

// parentComponent class 
Service.someEvent.subscribe(data => { 
    console.log(data); 
}); 

// childComponent class 
Service.invokeAnEvent('some data to pass'); 
कोणीय प्रलेखन से

:
https://angular.io/docs/ts/latest/cookbook/component-communication.html#!#bidirectional-service

+1

मुझे लगता है कि यह डोम घटनाओं को सुनने के लिए अधिक होगा। – maximedupre

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