В моем приложении у меня есть некоторые компоненты, которые обмениваются с помощью EventService
.
@Injectable()
export class EventService {
public myEvent: EventEmitter<any> = new EventEmitter();
constructor() {}
}
Эта услуга вводится в EmitterComponent
, которая испускает событие при нажатии кнопки
@Component({
selector: 'emitter',
template: `<button (click)="onClick()">Click me</button>`,
})
export class EmitterComponent {
constructor(private eventService:EventService) {}
onClick() {
this.eventService.myEvent.emit();
}
}
и в ReceiverComponent
, который подписывается на событие и для каждого полученного события увеличивается счетчик
@Component({
selector: 'receiver',
template: `Count: {{count}}`,
})
export class ReceiverComponent {
public count = 0;
constructor(private eventService:EventService) {
this.eventService.myEvent.subscribe(() => this.count++;);
}
}
Приложение имеет несколько видов (в этом примере всего два): PageA
и PageB
. EmitterComponent
и ReceiverComponent
находятся в PageA
. Каждый раз, когда я перехожу к PageB
и возвращаюсь к PageA
, создается новый ReceiverComponent
, и когда я нажимаю кнопку в EmitterComponent
, функция обратного вызова события ReceiverComponent
выполняется несколько раз.
Чтобы этого избежать, я отписываю ReceiverComponent
из myEvent
в ngOnDestroy
ngOnDestroy() {
this.eventService.myEvent.unsubscribe();
}
но это вызывает следующее исключение
EXCEPTION: Error during instantiation of ReceiverComponent!.
ORIGINAL EXCEPTION: Error: Cannot subscribe to a disposed Subject
Как я могу избежать этого? Как правильно отписаться?
Для лучшего понимания я создал этот plunker, где вы можете увидеть ошибку и некоторые комментарии в консоли.