page navigationend cambiar angular rxjs eventemitter angular2-services rxjs5

angular - navigationend - ¿Cómo suscribirse al emisor de eventos una vez?



title angular 6 (2)

Puedes hacer algo como esto:

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(); }

// 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 se muestra en / route. Cuando navego por una ruta diferente en mi aplicación y vuelvo de nuevo, SomeComponent se suscribirá nuevamente al evento, lo que provocará que la devolución de llamada se SomeComponent dos veces. ¿Cómo suscribirse al evento una vez o cancelar la suscripción al destruir el componente y volver a suscribirse?

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


Una llamada a subscribe devuelve una instancia de Disposable , que tiene un método dispose .

O si está utilizando RxJS 5, se ha cambiado el nombre de Disose a unsubscribe (gracias @EricMartinez).

Y a partir de los documentos RxJS :

... cuando ya no estamos interesados ​​en recibir los datos a medida que se transmiten, llamamos a disposición en nuestra suscripción.

Almacene el resultado de su llamada para subscribe y luego deshágase de la suscripción dentro de 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(); } }