145 votes

Comment rafraîchir un composant en Angular

Je travaille sur un projet Angular. Je rencontre des difficultés avec l'action de rafraîchissement dans un composant.

Je voudrais rafraîchir les composants du routeur lors du clic sur un bouton. J'ai un bouton de rafraîchissement et lorsque je clique dessus, le composant/routeur doit être rafraîchi.

J'ai essayé window.location.reload() et location.reload() mais ces deux ne conviennent pas à mes besoins. Merci de m'aider si quelqu'un est au courant.

0 votes

Pouvez-vous partager votre code dans cette question ? ce que vous avez essayé.

0 votes

C'est un code complexe, il comporte N lignes de code, difficile à partager

0 votes

@Saurabh, normalement, il n'est pas nécessaire de recharger un composant. Vous pouvez avoir une fonction (par exemple, appeler "restart") et appeler la fonction dans votre bouton Rafraîchir. Si vous avez besoin de vous abonner pour changer de chemin, ou pour un autre service, utilisez la fonction ngOnInit - votre composant doit étendre OnInit -, pas le constructeur.

168voto

Après quelques recherches et avoir modifié mon code comme ci-dessous, le script a fonctionné pour moi. J'ai juste ajouté la condition :

this.router.navigateByUrl('/RefreshComponent', { skipLocationChange: true }).then(() => {
    this.router.navigate(['Your actualComponent']);
});

2 votes

Je suis en train d'utiliser cela dans un service injectable. J'ai remplacé "votre actualComponent" par une variable. La variable est définie sur this.location.path() avant l'appel à navigateByUrl. De cette façon, il n'est pas nécessaire de transmettre des paramètres à partir du composant appelant ou de dupliquer/transmettre les routes.

9 votes

Pouvez-vous s'il vous plaît expliquer ce qu'est 'RefrshComponent' et 'Votre actualComponent'?

25 votes

La plupart des gens se débrouilleront bien en utilisant '/' là où se trouve /RefrshComponent, et pour [Votre composant réel"] vous passeriez simplement l'URL (et/ou les paramètres) que vous souhaitez recharger comme this.router.navigate(["/items"]). Cette astuce redirige essentiellement vers l'URL supérieure, puis très rapidement vers l'URL prévue, ce qui est imperceptible pour la plupart des utilisateurs et semble être la meilleure astuce élégante pour y parvenir simplement.

104voto

Shinoy Babu Points 397

Utilisez le this.ngOnInit(); pour recharger le même composant au lieu de recharger toute la page !!

DeleteEmployee(id:number)
  {
    this.employeeService.deleteEmployee(id)
    .subscribe( 
      (data) =>{
        console.log(data);

        this.ngOnInit();

      }),
      err => {
        console.log("Erreur");
      }   
  }

13 votes

Tandis que cela pourrait répondre à la question des auteurs, il manque quelques mots explicatifs et/ou des liens vers la documentation. Les extraits de code brut ne sont pas très utiles sans quelques phrases autour d'eux. Vous pouvez également trouver comment rédiger une bonne réponse très utile. Veuillez éditer votre réponse.

2 votes

Ceci est une meilleure entrée que la réponse sélectionnée mais elle manque d'explication. Dans mon cas spécifique, j'ai dû rafraîchir un composant enfant. Dans ce cas, il existe plusieurs façons, mais les recommandées sont d'utiliser un service ou de diffuser un événement du parent à l'enfant.

9 votes

D'accord, cela ne fonctionne que si vous souhaitez actualiser le composant de l'intérieur du composant - si vous traitez avec des composants enfants/externes cette.ngOnInit() ne fonctionnera pas

31voto

sankar Points 389

Ajouter ce code au constructeur du composant requis a fonctionné pour moi.

this.router.routeReuseStrategy.shouldReuseRoute = function () {
  return false;
};

this.mySubscription = this.router.events.subscribe((event) => {
  if (event instanceof NavigationEnd) {
    // Tromper le Router en lui faisant croire que son dernier lien n'avait pas été chargé précédemment
    this.router.navigated = false;
  }
});

N'oubliez pas de se désabonner de ce mySubscription dans ngOnDestroy().

ngOnDestroy() {
  if (this.mySubscription) {
    this.mySubscription.unsubscribe();
  }
}

Référez-vous à ce fil de discussion pour plus de détails - https://github.com/angular/angular/issues/13831

25voto

Lucian Moldovan Points 287

Heureusement, si vous utilisez Angular 5.1+, vous n'avez plus besoin d'implémenter un hack car le support natif a été ajouté. Vous avez juste besoin de définir onSameUrlNavigation sur 'reload' dans les options du RouterModule :

@ngModule({
 imports: [RouterModule.forRoot(routes, {onSameUrlNavigation: ‘reload’})],
 exports: [RouterModule],
 })

Plus d'informations peuvent être trouvées ici : https://medium.com/engineering-on-the-incline/reloading-current-route-on-click-angular-5-1a1bfc740ab2

0 votes

Vous pouvez également utiliser la propriété router.onSameUrlNavigation = 'reload' de Router injecté.

6 votes

Utiliser angular 6, pour moi cela n'a pas fait de différence, c'est-à-dire que le composant n'a pas été rechargé. La réponse acceptée fonctionne cependant.

7 votes

Bien que pas entièrement clair dans la documentation, onSameUrlNavigation est destiné à réinvoquer des Guards/Resolvers, et non à recharger des composants déjà routés. Voir github.com/angular/angular/issues/21115 pour plus d'informations à ce sujet. Cette solution fonctionnera pour des applications plus complexes utilisant des Guards/Resolvers, mais échouera pour des exemples simples.

13voto

Vadapalli Chaitu Points 103

C'est un peu hors du commun et je ne sais pas si cela vous aide ou non mais avez-vous essayé

this.ngOnInit();

C'est une fonction donc tout le code que vous avez à l'intérieur sera rappelé comme un rafraîchissement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X