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.
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.
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.