I am currently writing my first Angular 2 Application. I have an OverviewComponent which has the following simple template:
<div class="row">
<div class="col-lg-8">
<router-outlet></router-outlet>
</div>
<div class="col-lg-4">
<app-list></app-list>
</div>
</div>
when accessing the url /
my router redirects me to /overview
which then loads a map within the router-outlet. The <app-list>
has a list of clickable items which triggers a <app-detail>
to be displayed instead of the app component. Therefor I pass the id of the referring json file in the url like that: /details/:id
(in my routes).
All of the above works totally fine. If I now click on one of the list items the details are shown, BUT when I select another list element the view doesn't change to the new details. The URL does change but the content is not reloaded. How can I achieve a Reinitialization of the DetailComponent?
You can change the routeReuseStrategy directly at the component level:
constructor(private router: Router) {
// force route reload whenever params change;
this.router.routeReuseStrategy.shouldReuseRoute = () => false;
}
Likewise, the reuse strategy can be changed globally.
This does not necessarily address your problem directly but seeing how this question is the first search result for "angular 2 reload url if query params change" it might save the next person from digging through the github issues.
As per the first final release, this is resolved.
Just pay much attention to correctly reset the state of the component when the parameter changes
this.route.params.subscribe(params => {
this.param = params['yourParam'];
this.initialiseState(); // reset and set based on new parameter this time
});
Another alternative that should be added here is to provide a RouteReuseStrategy to your module.
providers: [
{
provide: RouteReuseStrategy,
useClass: AARouteReuseStrategy
}
]
The default behaviour of the router is to reuse the route if the configuration is the same (which is the case when only changing the :id param in this question). By changing the strategy to not reuse the route, the component will be reloaded, and you do not have to subscribe to route changes in the component.
An implementation of the RouteReuseStrategy could be like this:
export class AARouteReuseStrategy extends RouteReuseStrategy {
shouldDetach(route: ActivatedRouteSnapshot): boolean {
return false;
}
store(route: ActivatedRouteSnapshot, handle: {}): void {
}
shouldAttach(route: ActivatedRouteSnapshot): boolean {
return false;
}
retrieve(route: ActivatedRouteSnapshot): {} {
return null;
}
shouldReuseRoute(future: ActivatedRouteSnapshot, curr: ActivatedRouteSnapshot): boolean {
return false; // default is true if configuration of current and future route are the same
}
}
I've written some about it here too:
https://pjsjava.blogspot.no/2018/01/angular-components-not-reloading-on.html
import { Router } from '@angular/router';
constructor(private router: Router) {
}
ngOnInit() {
this.router.routeReuseStrategy.shouldReuseRoute = () => {
// do your task for before route
return false;
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With