Reputation: 8414
I want to be able to change data on my page based on the URL route, i.e. test/1 gets me data set 1, test/2 gets me data set 2. However if i am already on test/1 and try to navigate to test/2 (and vice versa) using router navigate, it changes the url but that's it, nothing else gets triggered.
I have following definition for my route:
const routes: Routes = [
{
path: 'test',
children: [
{
path: ':id',
component: TestComponent
},
{ path: '**', redirectTo: '', pathMatch: 'full' }
]
},
];
TS Component:
value: any;
constructor(private router: Router, private, private route: ActivatedRoute) {
this.value = this.route.snapshot.params.id;
}
goToPage(value: any) {
this.router.navigate(['/test', value]);
}
my html component:
{{value}}
<button (click)="goToPage(1)">One</button>
<button (click)="goToPage(2)">Two</button>
I've also tried adding { onSameUrlNavigation: 'reload' } to RouterModule.forRoot, still doesn't do anything.
NOTE: Problem is not to get the parameter, the problem is the refresh of the page that has to take place to trigger all processes associated with the new parameter.
Upvotes: 12
Views: 36388
Reputation: 3156
My full solution using the subscribe()
method, in TS with Angular:
import { Component, OnInit } from '@angular/core'
import { Params, Router } from '@angular/router'
import { ActivatedRoute } from '@angular/router'
import { Location } from '@angular/common'
import { UserService } from '../user.service'
import { User } from '../user.model'
import { Observable, of } from 'rxjs'
export class YourComponent implements OnInit {
user$: Observable<User> = of({} as User)
id: number | undefined = 0
constructor(
private router: Router,
private route: ActivatedRoute,
private userService: UserService,
private location: Location
) {
this.id = this.route.snapshot.params.id
// Listen on change event for ID parameter
this.route.params.subscribe((params: Params) => {
this.id = params['id']
this.loadDetails() // triggered when pressing the button
});
}
ngOnInit() {
this.loadDetails() // Initial load during page load
}
changePage(userId: number) {
this.router.navigate(['user/detail', userId])
}
private loadDetails() {
const id = (this.id) ? +this.id : 0 // Zero should fail
this.user$ = this.userService.getOne(id) // Your service or API or...
}
}
HTML template:
<button mat-raised-button type="submit" (click)="changePage(user.id)">BLabla</button>
Upvotes: 0
Reputation: 8414
Resolved the problem by implementing the following code:
this.router.navigate(['/test', value])
.then(() => {
window.location.reload();
});
Upvotes: 11
Reputation: 1271
constructor(private router: Router, private, private route: ActivatedRoute) {
this.value = this.route.snapshot.params.id; // for first entry
route.params.subscribe(val => {
this.value = this.route.snapshot.params.id;
// put the code to initialize the page
});
}
goToPage(value: any) {
this.router.routeReuseStrategy.shouldReuseRoute = function () {
return false;
}
this.router.onSameUrlNavigation = 'reload';
this.router.navigate(['/test', value]);
}
Upvotes: 15
Reputation: 158
For it to be able to refresh the data, this piece of code this.value = this.route.snapshot.params.id
should be called in ngOnInit()
in this manner:
ngOnInit() {
this.activatedRoute.params.subscribe(
param => {
this.value = param['id']
}
}
);
}
Upvotes: 3
Reputation: 4127
Instead of getting params from this.value = this.route.snapshot.params.id
you can subscribe the paramMap
and get the id
this.route.paramMap.subscribe(
(params: ParamMap) => {
const id = params.get('id');
// call your api etc to get the record against new id
}
);
Upvotes: 1