Как подписаться на event emitter один раз?
// 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();
}
2 ответов
вызов subscribe
возвращает экземпляр Disposable
, который имеет метод dispose
.
или если вы используете RxJS 5, dispose
переименовано в unsubscribe
(спасибо @EricMartinez).
и RxJS docs:
...когда мы больше не заинтересованы в получении данных по мере их поступления, мы вызываем dispose на нашем подписка.
сохранить результат вызова subscribe
и позже избавиться от подписки в ngOnDestroy
.
RxJS 5:
export class SomeComponent {
constructor (public service: Service) {
this.subscription = this.service.someEvent.subscribe((x) => {...});
}
ngOnDestroy () {
this.subscription.unsubscribe();
}
}
RxJS
export class SomeComponent {
constructor (public service: Service) {
this.subscription = this.service.someEvent.subscribe((x) => {...});
}
ngOnDestroy () {
this.subscription.dispose();
}
}
вы можете сделать что-то вроде этого:
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();
}