route example current activatedroute angular typescript angular2-router3 angular2-router

angular - example - ¿Tengo que cancelar la suscripción de los observables ActivatedRoute(por ejemplo, params)?



routeparams angular 4 (4)

Encuentro muchos ejemplos en los que ActivatedRoute Observables como params o url están suscritos pero no cancelados.

constructor(private route: ActivatedRoute) {} ngOnInit() { this.route.params // (+) converts string ''id'' to a number .switchMap((params: Params) => this.service.getHero(+params[''id''])) .subscribe((hero: Hero) => this.hero = hero); }

  • ¿Se destruyen los objetos y las suscripciones de ruta de forma automática y se crean de nuevo para cada creación de componente?
  • ¿Tengo que preocuparme por cancelar la suscripción a esos Observable s?
  • Si no es así, ¿puede explicar qué sucede con el árbol de objetos ActivatedRoute en el Router ? routerState ?

Cada vez que agregue suscribirse a un componente, casi siempre tendrá que cancelar la suscripción cuando se destruya el componente. Pero suscribirse a los parámetros de ruta activada no requiere anular la suscripción, ya que el enrutador destruye la suscripción cuando ya no se necesita.


Como la respuesta ganadora quotes las subscriptions a ActivatedRoute , Angular se unsubscribes automáticamente.

quotes

En caso de que desee saber cómo unsubscribe de unsubscribe de Observables :

import { Component, OnInit, OnDestroy } from ''@angular/core''; import { ActivatedRoute } from ''@angular/router''; // Type import { Subscription } from ''rxjs/Subscription''; @Component({ selector: ''app-example'', templateUrl: ''./example.component.html'', styleUrls: [''./example.component.scss''] }) export class ExampleComponent implements OnInit, OnDestroy { paramsSubscription : Subscription; constructor(private activatedRoute : ActivatedRoute) { } /* Angular lifecycle hooks */ ngOnInit() { console.log("Component initialized"); this.paramsSubscription = activatedRoute.params.subscribe( params => { }); } ngOnDestroy() { console.log("Component will be destroyed"); this.paramsSubscription.unsubscribe(); } }


El componente se destruirá y el estado del enrutador quedará sin referencia cuando el enrutador navegue a una ruta diferente, lo que hará que sean libres de recolectar la basura, incluido el observable.

Si transfiere las referencias a este componente a otros componentes o servicios, el componente no se recolectará como basura y la suscripción se mantendrá activa, pero estoy seguro (sin verificar) que el enrutador completará el observable cuando navegue de distancia y hacer que la suscripción se cancele.


De la documentación :

Al suscribirse a un observable en un componente, casi siempre se dispone a cancelar la suscripción cuando se destruye el componente.

Hay algunos observables excepcionales donde esto no es necesario. Los observables de ActivatedRoute están entre las excepciones.

El ActivatedRoute y sus observables están aislados del propio enrutador. El enrutador destruye un componente enrutado cuando ya no es necesario y el ActivatedRoute inyectado muere con él.

Siéntase libre de darse de baja de todos modos. Es inofensivo y nunca es una mala práctica.