2016-01-17 18 views
20
// Part of service 
public someEvent: EventEmitter<number> = new EventEmitter(); 

.... 

// Component 
@Component({ 
    selector: 'some-component', 
    template: `...` 
}) 
export class SomeComponent { 
    constructor(public service: Service) { 
    this.service.someEvent.subscribe((x) => { 
     // Do something 
    }); 
    } 
} 

SomeComponent/ मार्ग में प्रदर्शित होता है। जब मैं अपने आवेदन में अलग-अलग मार्ग पर नेविगेट करता हूं, और फिर वापस आ जाता हूं, SomeComponent फिर से ईवेंट की सदस्यता लेता है, जिससे कॉलबैक दो बार आग लग जाता है। घटना के सब्सक्राइब करने के बाद एक बार या सदस्यता की बर्बादी पर सदस्यता कैसे लें?एक बार ईवेंट एमिटर की सदस्यता कैसे लें?

// Can't subscribe after. 
ngOnDestroy() { 
    this.service.someEvent.unsubscribe(); 
} 
+0

आप ngOnInit साथ यह कोशिश की है? – micronyks

+0

@micronyks हाँ मैंने किया, हालांकि कोई सफलता नहीं हुई। इसके अलावा [इस साइट] के अनुसार (http://learnangular2.com/lifecycle/) 'ngOnInit' हर बार कन्स्ट्रक्टर फ़ंक्शन की तरह निकाल दिया जाता है, लेकिन यह प्रारंभ करने के लिए बाल घटकों की प्रतीक्षा करता है। – Eggy

+1

'ऑनइनिट' बाध्यकारी है, आपके लिए काम नहीं करेगा ... कोशिश करें ['CanReuse'] (https://angular.io/docs/ts/latest/api/router/CanReuse-interface.html) – Sasxa

उत्तर

27

subscribe को एक कॉल एक instance of Disposable है, जो एक विधि dispose है देता है।

या यदि आप आरएक्सजेएस 5, dispose has been renamed to unsubscribe (धन्यवाद @EricMartinez) का उपयोग कर रहे हैं।

और RxJS docs से:

... के रूप में यह में स्ट्रीमिंग आता है जब हम डेटा प्राप्त करने में नहीं रह गया है रुचि रखते हैं, हम अपने सदस्यता पर निपटाने कहते हैं।


स्टोर subscribe करने के लिए अपने कॉल का परिणाम और बाद में ngOnDestroy भीतर सदस्यता के निपटान के।

RxJS 5:

export class SomeComponent { 
    constructor (public service: Service) { 
    this.subscription = this.service.someEvent.subscribe((x) => {...}); 
    } 
    ngOnDestroy() { 
     this.subscription.unsubscribe(); 
    } 
} 

RxJS < 5:

export class SomeComponent { 
    constructor (public service: Service) { 
    this.subscription = this.service.someEvent.subscribe((x) => {...}); 
    } 
    ngOnDestroy() { 
     this.subscription.dispose(); 
    } 
} 
+4

आरएक्सजेएस 5 में [निपटान का नाम बदलकर रद्द कर दिया गया था] (https://github.com/ReactiveX/ आरएक्सजेएस/ब्लॉब/मास्टर/एमआईजीआरेशन.एमडी # सदस्यता-निपटान-अब-सदस्यता रद्द करें) –

+2

धन्यवाद! @EricMartinez की तरह ही, 'निपटान' के बजाय 'सदस्यता समाप्त करें'। – Eggy

+0

@EricMartinez धन्यवाद, मैं अपना जवाब अपडेट करूंगा! – sdgluck

2

आप कुछ इस तरह कर सकते हैं:

import { OnDestroy } from '@angular/core'; 
import { Subscription } from 'rxjs/Rx'; 

export class SomeComponent implements OnDestroy { 
    private _subscription: Subscription; 
    constructor(public service: Service) { 
    this._subscription = this.service.someEvent.subscribe((x) => { 
     // Do something 
    }); 
    } 
} 

ngOnDestroy(){ 
    this._subscription.unsubscribe(); 
} 
संबंधित मुद्दे