web-dev-qa-db-fra.com

Dois-je me désabonner des observables ActivatedRoute (par exemple, params)?

Je trouve de nombreux exemples où ActivatedRoute Des observables comme params ou url sont abonnés mais non désabonnés.

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);
}
  • Les objets de route et les abonnements sont-ils détruits automatiquement et nouvellement créés pour chaque création de composant?
  • Dois-je m'inquiéter de la désinscription de ces Observables?
  • Si non, pouvez-vous expliquer ce qui se passe avec l'arborescence d'objets ActivatedRoute dans Router.routerState?
26
hgoebl

À partir de la documentation

Lorsque vous vous abonnez à un élément observable dans un composant, vous pouvez presque toujours vous désabonner lorsque le composant est détruit.

Il y a quelques observables exceptionnels où ce n'est pas nécessaire. Les observables ActivatedRoute font partie des exceptions.

ActivatedRoute et ses observables sont isolés du routeur lui-même. Le routeur détruit un composant routé lorsqu'il n'est plus nécessaire et que ActivatedRoute injecté meurt avec lui.

N'hésitez pas à vous désinscrire quand même. C'est inoffensif et jamais une mauvaise pratique.

58
Milad

Le composant sera détruit et routerState ne sera plus référencé lorsque le routeur naviguera vers un autre itinéraire, ce qui les libérera du droit de se faire ramasser les ordures, y compris l'observable.

Si vous transmettez des références de ce composant à d'autres composants ou services, le composant ne sera pas nettoyé et l'abonnement resterait actif, mais je suis sûr (sans vérifier) ​​que l'observable sera complété par le routeur lors de la navigation et faire annuler la souscription.

6
Günter Zöchbauer

Chaque fois que vous ajoutez un abonnement à un composant, vous devez presque toujours vous désabonner lorsque le composant est détruit. Mais vous abonner aux paramètres de route activée ne nécessite pas de vous désabonner car le routeur détruit l'abonnement dès qu'il n'est plus nécessaire.

0
thegautamnayak

Comme réponse gagnante citations à propos de subscriptions à ActivatedRoute, Angular unsubscribes automatiquement.

Le routeur détruit un composant routé quand il n'est plus nécessaire et que ActivatedRoute injecté meurt avec lui.

Si vous voulez savoir comment unsubscribe à partir 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();
  }

}
0
Marian07