2017-02-08 6 views
5

[कोणीय 2.4.5]कोणीय घटक: क्या मैं एक ऑब्जर्जेबल के बजाय EventEmitter को @Output() प्रॉपर्टी के रूप में उपयोग कर सकता हूं?

मैंने कोशिश की और यह एक EventEmitter की तरह काम करने लगता है:

  • बाहर से मेरे घटक:

    :

    <split (visibleTransitionEnd)="log($event)"></split> 
    
  • घटक के अंदर

    @Output() visibleTransitionEnd: Observable<string> 
    observer: Observer; 
    
    constructor() { 
        const myObs = new Observable(observer => this.observer = observer); 
    
        this.visibleTransitionEnd = myObs 
        .map(x => '> ' + x + ' <') 
        .debounceTime(20) 
        .do(() => console.log('here we are!')); 
    } 
    
  • फिर मैं कंपो के अंदर कॉल कर सकता हूं माने:

    // needed condition because if nobody subscribe 'visibleTransitionEnd' > no observer! 
    if(this.observer) this.observer.next('test'); 
    

View this plunker

मुझे यह पसंद मेरी घटक के अंदर कोई सदस्यता है क्योंकि।

लेकिन क्या यह हासिल करने का यह एक बुरा तरीका है? जोखिम/गलत क्या है?

क्या Subject का उपयोग करना बेहतर है?

उत्तर

3

ठीक है, आपकी स्थिति में आप EventEmitter या Subject का उपयोग कर सकते हैं। आप देख सकते हैं कि EventEmitterSubject जैसा है (हालांकि यदि आप कर सकते हैं तो EventEmitter का उपयोग करने की अनुशंसा की जाती है)। https://github.com/angular/angular/blob/master/modules/%40angular/facade/src/async.ts

Observable.create (या new Observable()) इस तरह उपयोग करने का इरादा नहीं है। आंतरिक कार्य को पर्यवेक्षक को मूल्यों को उत्सर्जित करना चाहिए और एक आंसू कार्य को वापस करना चाहिए (संसाधनों को छोड़ना या जो भी हो)। संपत्ति के रूप में नहीं रखा जाना चाहिए।
हालांकि, मुझे यकीन नहीं है कि इसका क्या परिणाम हो सकता है (मेमोरी लीक?)।

तो बल्कि Subject बजाय का उपयोग करें:

export class SplitComponent implements OnDestroy { 
    @Output() visibleTransitionEnd: Observable<string> 
    visibleTransitionEndObserver: Subject; 

    constructor() { 
    const subject = new Subject(); 

    this.visibleTransitionEnd = subject.asObservable() 
     .map(x => '> ' + x + ' <') 
     .debounceTime(20) 
     .do(() => console.log('here we are!')); 
    } 

    // ... 
} 
+0

thx, मैंने अपने प्लंकर को उत्तर के बाद अपडेट किया है और यह 'asbservable 'ऑपरेटर को जोड़ने के बिना' विषय 'के साथ अच्छी तरह से काम करता है, आपने इसे क्यों जोड़ा? – bertrandg

+0

@bertrandg http://stackoverflow.com/questions/39703167/changes-in-observable-not-reflected-in-view/39721493#39721493 और https://github.com/Reactive-Extensions/RxJS/blob/ देखें मास्टर/doc/API/कोर/ऑपरेटरों/asobservable.md – martin

8

EventEmitter सिर्फ Subject बढ़ाता है, इसलिए यह कोई आश्चर्य नहीं है (और मैंने इसे पहले ही डार्ट में देखा है)।

वे मौजूदा कोड को तोड़ने के बाद बाद में कार्यान्वयन को बदलने में सक्षम होने के लिए अपनी कक्षा का उपयोग करते हैं।

तो यह इस अमूर्तता को रोकने के लिए सबसे अच्छा विचार नहीं हो सकता है। यदि आप नुकसान के बारे में जानते हैं और इसे स्वीकार करने के इच्छुक हैं, तो आप निश्चित रूप से ऐसा कर सकते हैं।

+0

क्या आप जानते हैं अगर यह .publishReplay/@Output के रूप में उपयोग + refcount प्रकाशित करें और निशान यह करने के लिए ठीक हो सकता है? – kubal5003

+0

मुझे नहीं पता, लेकिन पता लगाना मुश्किल नहीं होना चाहिए। –

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

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