J'utilise Angular 5 bibliothèque, je veux naviguer vers l'URL actuelle avec recharger (actualiser) le composant entier pas la page, j'ai lu sur la navigation vers l'URL actuelle dans angular document.
Et c'est ce dont j'ai besoin:
/**
* Define what the router should do if it receives a navigation request to the current URL.
* By default, the router will ignore this navigation. However, this prevents features such
* as a "refresh" button. Use this option to configure the behavior when navigating to the
* current URL. Default is 'ignore'.
*/
onSameUrlNavigation: 'reload' | 'ignore';
Maintenant, j'ai essayé de définir la propriété onSameUrlNavigation
sur reload
puis de naviguer vers la même URL, mais rien ne s'est passé, comme ceci:
this.router.onSameUrlNavigation = 'reload';
this.router.navigate(['view'], { queryParams: { QueryUUID: selectedId } });
Quelqu'un l'a déjà utilisé, peut-il aider?
J'ai trouvé cette méthode de contournement depuis la propriété onSameUrlNavigation
dans Angular 5.1 n'est pas ce dont j'ai besoin.
J'ai juste besoin de remplacer shouldReuseRoute
, j'ai donc ajouté une exception pour la route du composant que je veux rafraîchir, si la route actuelle et future sont égales view
.
Et je peux également naviguer vers un autre itinéraire sans problème, même pour naviguer à partir de Angular Material
sidenav
.
this.router.routeReuseStrategy.shouldReuseRoute = function (future: ActivatedRouteSnapshot, curr: ActivatedRouteSnapshot) {
if (future.url.toString() === 'view' && curr.url.toString() === future.url.toString()) {
return false;
}
return (future.routeConfig === curr.routeConfig);
};
Mise à jour:
Pour ceux qu'ils veulent utiliser la nouvelle propriété onSameUrlNavigation
dans Angular 5.1 vous pouvez vous référer à ce blog:
Si je vous comprends bien, voici comment je le fais:
ngOnInit(): void {
this.route.params.subscribe(
params => {
const id = +params['id'];
this.getMovie(id);
}
);
}
Ou pour regarder les paramètres de requête:
ngOnInit(): void {
this.route.queryParams.subscribe(param => {
this.pageTitle = 'Movie List';
this.getMovies();
});
}
Dans le ngOnInit, je surveille les modifications des paramètres. Lorsque les paramètres changent, je récupère à nouveau les données.
Comme les données sont toutes liées, la page "se rafraîchit" avec les données nouvellement récupérées.
Vous pouvez utiliser les événements de routeur angular à cet effet.
import { takeUntil, filter } from "rxjs/operators";
import { Router, NavigationEnd } from "@angular/router";
this.router.events.pipe(
filter((event): event is NavigationEnd => event instanceof NavigationEnd),
takeUntil(this._unsubscribeAll),
).subscribe(() => {
this.cache = {};
this.cachedRows = [];
this.getRollingJobs(this.page);
});
Dans le module d'itinéraire: ajoutez ci-dessous dans chaque déclaration d'itinéraire
runGuardsAndResolvers: 'always'
et
@ngModule({
imports: [RouterModule.forRoot(routes, {onSameUrlNavigation: ‘reload’})],
exports: [RouterModule],
})
par exemple category/:id
et cette partie ci-dessous sera sous Composante
ngOnInit() {
this.activeRoute.queryParams.subscribe(queryParams => {
// do something with the query params
});
this.activeRoute.params.subscribe(routeParams => {
this.loadUserDetail(routeParams.id);
});
}
pour chaque changement d'itinéraire, dites par exemple category/11
et category/12
il appellera la fonction loadUserDetail
à chaque fois.
Donc, sans rafraîchir la page, vous récupérerez les données du serveur et mettrez à jour le dom pour le même itinéraire avec différents roureParams.
En termes de rel-chargement de la page entière, la normale <a href="/">Reload Page</a>
tag fonctionne très bien pour moi. J'ai essayé d'utiliser la fonction "onSameUrlNavigation", mais elle ne rechargeait pas la page entière comme je le souhaitais.