J'utilise angular 2 avec une stratégie de hashlocation.
Le composant est chargé avec cette route:
"departments/:id/employees"
Jusqu'ici très bien.
Après avoir effectué une sauvegarde par lots réussie de plusieurs lignes de table modifiées, je veux recharger l'url de la route actuelle via:
this.router.navigate([`departments/${this.id}/employees`]);
Mais rien ne se passe, pourquoi?
Réponses:
Si votre navigateur () ne modifie pas l'URL déjà affichée dans la barre d'adresse de votre navigateur, le routeur n'a rien à faire. Ce n'est pas le travail du routeur de rafraîchir les données. Si vous souhaitez actualiser les données, créez un service injecté dans le composant et appelez la fonction de chargement sur le service. Si les nouvelles données seront récupérées, cela mettra à jour la vue via des liaisons.
la source
Cela peut maintenant être fait dans Angular 5.1 en utilisant le
onSameUrlNavigation
propriété de la configuration du routeur.J'ai ajouté un blog expliquant comment ici, mais l'essentiel est le suivant
https://medium.com/engineering-on-the-incline/reloading-current-route-on-click-angular-5-1a1bfc740ab2
Dans l'
onSameUrlNavigation
option d' activation de la configuration de votre routeur , définissez-la sur'reload'
. Cela amène le routeur à déclencher un cycle d'événements lorsque vous essayez de naviguer vers une route déjà active.Dans vos définitions d'itinéraire, définissez
runGuardsAndResolvers
suralways
. Cela indiquera au routeur de toujours lancer les cycles de gardes et de résolveurs, déclenchant les événements associés.Enfin, dans chaque composant dont vous souhaitez activer le rechargement, vous devez gérer les événements. Cela peut être fait en important le routeur, en se liant aux événements et en invoquant une méthode d'initialisation qui réinitialise l'état de votre composant et récupère les données si nécessaire.
Avec toutes ces étapes en place, vous devriez avoir activé le rechargement d'itinéraire.
la source
init
fonction,init
?Créez une fonction dans le contrôleur qui redirige vers la route attendue comme ceci
puis utilise-le comme ça
cette fonction redirigera vers une route factice et retournera rapidement à la route de destination sans que l'utilisateur s'en rende compte.
la source
'/'
place de'/DummyComponent'
ÉDITER
Pour les nouvelles versions d'Angular (5.1+), utilisez la réponse suggérée par @Simon McClive
Ancienne réponse
J'ai trouvé cette solution de contournement sur une demande de fonctionnalité GitHub pour Angular:
J'ai essayé d'ajouter cela à ma fonction app.component.ts
ngOnInit
, et cela a bien fonctionné. Tous les autres clics sur le même lien rechargent maintenant lecomponent
données et.Lien vers la demande de fonctionnalité GitHub d'origine
Le crédit revient à mihaicux2 sur GitHub.
J'ai testé ceci sur la version
4.0.0-rc.3
avecimport { Router, NavigationEnd } from '@angular/router';
la source
Peu compliqué: utilisez le même chemin avec des paramètres factices. Par exemple-
la source
this.router.navigate(['/pocetna'], { queryParams: { 'refresh': 1 } });
etroute.queryParams.subscribe(val => myRefreshMethod())
oùroute: ActivatedRoute
est injecté dans le composant rafraîchi ... J'espère que ça aideJ'utilise celui-ci pour le projet Angular 9:
PS: testé et fonctionne également sur "Angular 7, 8"
la source
Piratage de rechargement de routes angulaires 2-4
Pour moi, utiliser cette méthode à l'intérieur d'un composant racine (composant, qui est présent sur n'importe quelle route) fonctionne:
la source
Cela fonctionne pour moi comme un charme
la source
Sur la page de rechargement de changement de paramètre ne se produira pas. C'est vraiment une bonne fonctionnalité. Il n'est pas nécessaire de recharger la page mais nous devons changer la valeur du composant. La méthode paramChange appellera lors du changement d'URL. Nous pouvons donc mettre à jour les données des composants
la source
C'est ce que j'ai fait avec Angular 9 . Je ne suis pas sûr que cela fonctionne dans les anciennes versions.
Vous devrez l'appeler lorsque vous aurez besoin de recharger.
Le routeur forRoot doit avoir SameUrlNavigation défini sur `` recharger ''
Et chaque itinéraire doit avoir runGuardsAndResolvers défini sur `` toujours ''
la source
Pour moi travaille en dur avec
la source
Pour autant que je sache, cela ne peut pas être fait avec le routeur dans Angular 2. Mais vous pouvez simplement faire:
Pour recharger la vue.
la source
Nous avons trouvé une solution rapide et simple qui ne nécessite pas de bricoler le fonctionnement interne de angular:
En gros: créez simplement un itinéraire alternatif avec le même module de destination et basculez simplement entre eux:
Et voici le menu à bascule:
J'espère que ça aide :)
la source
Un peu hardcore mais
la source
Dans mon cas:
fonctionne correctement
la source
implémenter OnInit et appeler ngOnInit () dans la méthode pour route.navigate ()
Voir un exemple:
la source
Résolution d'un scénario similaire en utilisant un composant factice et une route pour
reload
, ce qui fait en fait unredirect
. Cela ne couvre certainement pas tous les scénarios utilisateur, mais a simplement fonctionné pour mon scénario.Le routage est câblé pour attraper toutes les URL à l'aide d'un caractère générique:
Pour l'utiliser, il suffit d'ajouter recharger l'url où nous voulons aller:
la source
Il existe différentes approches pour actualiser l'itinéraire actuel
Changer le comportement du routeur (depuis Angular 5.1) Réglez les routeurs onSameUrlNavigation sur «recharger». Cela émettra les événements du routeur sur la même navigation URL.
Laissez le routeur intact
J'ai écrit une explication plus détaillée sous https://medium.com/@kevinkreuzer/refresh-current-route-in-angular-512a19d58f6e
J'espère que cela t'aides.
la source
Supposons que la route du composant que vous souhaitez actualiser est
view
, puis utilisez ceci:vous pouvez ajouter un
debugger
à l'intérieur de la méthode pour savoir quel est l'itinéraire exact qui suivra après la navigation"departments/:id/employees"
.la source
Une solution est de passer un paramètre fictif (c'est-à-dire le temps en secondes), de cette façon le lien est toujours rechargé:
la source
J'utilise
setTimeout
etnavigationByUrl
pour résoudre ce problème ... Et cela fonctionne très bien pour moi.Il est redirigé vers une autre URL et revient à la place dans l'URL actuelle ...
la source
Je crois que cela a été résolu (nativement) dans Angular 6+; vérifier
ici https://github.com/angular/angular/issues/13831 &&
et ici https://medium.com/engineering-on-the-incline/reloading-current-route-on-click-angular-5-1a1bfc740ab2
Mais cela fonctionne pour un itinéraire complet (comprend également tous les itinéraires pour enfants)
Si vous souhaitez cibler un seul composant, procédez comme suit: Utilisez un paramètre de requête qui change, afin de pouvoir naviguer autant de fois que vous le souhaitez.
Au point de navigation (classe)
Dans le composant que vous souhaitez "actualiser / recharger"
la source
Très frustrant qu'Angular ne semble toujours pas inclure une bonne solution pour cela. J'ai soulevé un problème github ici: https://github.com/angular/angular/issues/31843
En attendant, c'est ma solution de contournement. Il s'appuie sur certaines des autres solutions suggérées ci-dessus, mais je pense que c'est un peu plus robuste. Il s'agit d'encapsuler le service Routeur dans un "
ReloadRouter
", qui prend en charge la fonctionnalité de rechargement et ajoute également unRELOAD_PLACEHOLDER
à la configuration principale du routeur. Ceci est utilisé pour la navigation intermédiaire et évite de déclencher d'autres routes (ou gardes).Remarque: utilisez uniquement le
ReloadRouter
dans ces cas où vous souhaitez la fonctionnalité de rechargement. Utilisez la normaleRouter
autrement.la source
Importer
Router
etActivatedRoute
depuis@angular/router
Injectez
Router
etActivatedRoute
(au cas où vous auriez besoin de quelque chose de l'URL)Obtenez n'importe quel paramètre si nécessaire à partir de l'URL.
Utiliser une astuce en naviguant vers une URL factice ou principale puis vers l'URL réelle actualisera le composant.
Dans ton cas
Si vous utilisez une route factice, vous verrez un titre clignotant «Not Found» si vous avez implémenté une URL non trouvée au cas où ne correspondrait à aucune URL.
la source
s'abonner aux modifications des paramètres d'itinéraire
la source
Si vous changez d'itinéraire via le lien du routeur, procédez comme suit:
la source
Vous devez utiliser la propriété "onSameUrlNavigation" dans RouterModule, puis vous abonner aux événements Route https://blog.angularindepth.com/refresh-current-route-in-angular-512a19d58f6e
la source
Décide quand la route doit être stockée retourne false à
et définissez la valeur de navigation du routeur sur false, ce qui montre que cette route n'a jamais été routée
la source
J'ai essayé quelques correctifs et aucun d'entre eux ne fonctionne. Ma version est simple: ajoutez un nouveau paramètre inutilisé dans les paramètres de requête
la source
window.location.replace
// utiliser le backtick pour délimiter la route
window.location.replace (
departments/${this.id}/employees
)la source