W mojej aplikacji mam pewne komponenty, które komunikują się za pomocą EventService
.Angular2, wypisanie z wydarzenia w ngOnDestroy
@Injectable()
export class EventService {
public myEvent: EventEmitter<any> = new EventEmitter();
constructor() {}
}
Usługa ta jest wstrzykiwany w EmitterComponent
emitującego zdarzenie gdy przycisk zostanie kliknięty
@Component({
selector: 'emitter',
template: `<button (click)="onClick()">Click me</button>`,
})
export class EmitterComponent {
constructor(private eventService:EventService) {}
onClick() {
this.eventService.myEvent.emit();
}
}
iw ReceiverComponent
że zgadza się z imprezy i dla każdego zdarzenia odebranych przyrostach licznik
@Component({
selector: 'receiver',
template: `Count: {{count}}`,
})
export class ReceiverComponent {
public count = 0;
constructor(private eventService:EventService) {
this.eventService.myEvent.subscribe(() => this.count++;);
}
}
Aplikacja ma wiele widoków (w tym przykładzie tylko dwa): PageA
i PageB
. EmitterComponent
i ReceiverComponent
są w PageA
. Za każdym razem, gdy przechodzę do PageB
i wracam do PageA
, tworzony jest nowy ReceiverComponent
i po kliknięciu przycisku w EmitterComponent
funkcja wywołania zwrotnego zdarzenia ReceiverComponent
jest wykonywana kilka razy.
Aby tego uniknąć wypisać ReceiverComponent
z myEvent
w ngOnDestroy
ngOnDestroy() {
this.eventService.myEvent.unsubscribe();
}
ale powoduje to następujący wyjątek
EXCEPTION: Error during instantiation of ReceiverComponent!.
ORIGINAL EXCEPTION: Error: Cannot subscribe to a disposed Subject
Jak mogę tego uniknąć? Jak poprawnie zrezygnować z subskrypcji?
Dla lepszego zrozumienia stworzyłem ten numer plunker, w którym można zobaczyć błąd i komentarze w konsoli.
To jest dokładnie to, co zrobiłem, ale to powoduje „Błąd: Nie można zapisać się do zbytej Temat” Kiedy zmienić pogląd na stronaB i wrócić do strony A – TizianoL
Nie wyglądają to samo dla mnie. Czy czegoś brakuje? W twoim pytaniu używasz 'this.eventService.myEvent.unsubscribe();' vs 'subscription.unsubscribe();'. –
Och, przepraszam, moja zła, nie zauważyłem różnicy. Teraz działa, wielkie dzięki! – TizianoL