2016-01-17 15 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

'OnInit' предназначен для привязки, а не для вас ... попробуйте [' CanReuse'] (https://angular.io/docs/ts/latest/api/router/CanReuse-interface.html) – Sasxa

ответ

27

Вызов subscribe возвращает instance of Disposable, который имеет метод dispose.

Или если вы используете RxJS 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

В RxJS 5 [распоряжение было переименовано для отмены подписки] (https://github.com/ReactiveX/ RxJS/blob/master/MIGRATION.md # подписка-dispose-is-now-unsubscribe) –

+2

Спасибо! Точно так же, как @EricMartinez сказал, 'unsubscribe' вместо' dispose'. – 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(); 
}