2016-05-11 16 views
8

मैं दो Angular2 घटक है जो एक सेवा के माध्यम से डेटा साझा करने की जरूरत है:अवलोकन करने के लिए सदस्यता लेने पर अंतिम मूल्य कैसे प्राप्त करें?

@Injectable() 
export class SearchService { 
    private searchResultSource = new Subject<string>() 
    searchResult$ = this.searchResultSource.asObservable() 

    setSearchResults(_searchResult: string): void { 
    this.searchResultSource.next(_searchResult) 
    } 
} 

मान लीजिए ComponentA प्रदान की गई है और यह SearchService.setSearchResults के माध्यम से एक घटना का उत्सर्जन करता है। फिर उपयोगकर्ता ComponentB पर जाता है, जो searchResult$ की सदस्यता भी लेता है। हालांकि, ComponentBComponentA द्वारा उत्सर्जित घटना का कभी भी निरीक्षण नहीं करेगा क्योंकि पर ComponentA पर एक ईवेंट उत्सर्जित नहीं किया गया था, क्योंकि यह अस्तित्व में नहीं था।

मैं Observable कैसे बना सकता हूं जो हर नए ग्राहक को अंतिम घटना को उत्सर्जित करता है?

उत्तर

18

BehaviorSubject तुरंत नए ग्राहकों के लिए अंतिम मान का उत्सर्जन करता है:

@Injectable() 
export class SearchService { 

    private searchResultSource = new BehaviorSubject<string>(1); 

    setSearchResults(_searchResult: string): void { 
     this.searchResultSource.next(_searchResult); 
    } 
} 

ReplaySubject नए ग्राहकों के लिए सभी पिछले घटनाओं का उत्सर्जन करता है।

6

तुम हमेशा इस तरह ऑब्जर्वर का अंतिम मान, कुछ पाने के लिए ReplaySubject उपयोग कर सकते हैं:

@Injectable() 
export class SearchService { 

    private searchResultSource = new ReplaySubject<string>(1); 

    setSearchResults(_searchResult: string): void { 
     this.searchResultSource.next(_searchResult); 
    } 
} 

और बस के रूप में सामान्य सदस्यता लें।
एक और अधिक उन्नत example यहां पाया जा सकता है: caching results with angular2 http service

+0

क्या आप "सामान्य के रूप में सदस्यता लें" समझा सकते हैं? क्या कोई ऐसा मामला है जहां सदस्यता काम नहीं करती है? – sabithpocker

+0

मेरा मतलब था कि मुझे यह दिखाने की ज़रूरत नहीं है कि आप इस ReplaySubject की सदस्यता कैसे लेते हैं, क्योंकि आपको सदस्यता पक्ष पर कुछ भी विशेष करने की आवश्यकता नहीं है, बस सदस्यता लें और आपको अंतिम मूल्य मिलेगा। – tibbus

+0

ठीक है शांत। मेरी एक ऐसी स्थिति थी जहां 'व्यवहार विषय' सब्सक्रिप्शन काम नहीं करता था, लेकिन 'ReplaySubject' किया था। समझने की कोशिश क्यों कर रहा था। – sabithpocker

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

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