NB. I've got a set of resulting from googling but, as I explain at the end, I sense that they aren't reliable, due to diversity.
I have two utility methods - one for navigating to the parent node and one for reloading self. The first one works as supposed to, while the other one fails to cause the reload.
navigateToParent(route: ActivatedRoute) {
const options: NavigationExtras = { relativeTo: route };
this.router.navigate([".."], options);
}
navigateToSelf(route: ActivatedRoute) {
this.router.routeReuseStrategy.shouldReuseRoute = () => false;
this.router.onSameUrlNavigation = "reload";
const self = ".";
this.router.navigate([self]);
// const options: NavigationExtras = { relativeTo: route };
// this.router.navigate(["."], options);
}
I followed the answer here, with the only exception that I'd like my path navigated to, to be generic, not hard-coded. I've tried passing different parameters, like self="." and self="" etc. Nothing seems to give me the desired reload.
What do I miss?
I also tried to pick the parts from the route passed into the service's method but I only see a bunch of observables, not the actual segments. And, of course, this.router.navigate(route) only caused an error.
Googling produced a lot of hints with vastly varying suggestions (e.g. this), which leads me to the suspicion that it might be heavily dependent on the version (I'm on 8.0) and, also, that many of the suggestions, although accepted, might be misleading and more harmful in the long run, without me realizing it.
You can find total working example here in this StackBlitz Link
Update
First of all doing window.location.reload()
is totally against of Single-Page-Application nature. rather, You can reload particular component when actually clicking on that link.. so, to do this task we have angular router. For particular component reload you can push this line of code in main app.component.ts once for full application.
mySubscription;
constructor(private router: Router, private activatedRoute: ActivatedRoute){
this.router.routeReuseStrategy.shouldReuseRoute = () => false;
this.mySubscription = this.router.events.subscribe((event) => {
if (event instanceof NavigationEnd) {
// Trick the Router into believing it's last link wasn't previously loaded
this.router.navigated = false;
}
});
}
above code we are going to subscribing
to router-events
. and then we are checking each and every router-NavigationEnd
event, then just telling router, forget to add current navigation of router to its own history. So, each time whenever we are trying to reload same component each and every events are firing for that particular component only, thats a SPA.
IN app.component.ts of ngOnDestroy()
we have to unsubscribe from router events, when component is destroyed.
ngOnDestroy(){
if (this.mySubscription) {
this.mySubscription.unsubscribe();
}
}
Now, for example you have Home and Details component or anything else of component... You can reload each component by calling this.router.navigate([this.router.url])
this will reload all current component. for example, In home component
we have reload-button
and click event of that we are just calling this.router.navigate([this.router.url])
. same for details component too.. or any other component..
Home.component.ts
reLoad(){
this.router.navigate([this.router.url])
}
Details.component.ts
reLoad(){
this.router.navigate([this.router.url])
}
You can check in updated above StackBlitz link, all working example of reloading with full router-state reloading. In browser console see each and every events of component is firing by clicking button reload()
.