1

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.

Aeseir
  • 6,726
  • 9
  • 51
  • 98

4 Answers4

1

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']
        }
      }
    );
  }
sephoro
  • 122
  • 9
0

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
  }
);
Kamran Khatti
  • 3,083
  • 1
  • 17
  • 27
  • Yep already across that method but how does that solve refresh of the page problem? – Aeseir Aug 13 '21 at 03:50
  • @Aeseir it subscribe each time when route change and you will have a new route value, I believe I posted this answer first so you should have accept my attempt :) anyways you can upvote though – Kamran Khatti Aug 17 '21 at 07:36
0

Option 1: Listen to route changes and initialize page

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
   });

}

Option 2: Reinitialize the page on route navigation

goToPage(value: any) {
    this.router.routeReuseStrategy.shouldReuseRoute = function () {
        return false;
    }
    this.router.onSameUrlNavigation = 'reload';
    this.router.navigate(['/test', value]);
}
Jp Vinjamoori
  • 936
  • 4
  • 14
0

Resolved the problem by implementing the following code:

    this.router.navigate(['/test', value])
        .then(() => {
          window.location.reload();
        });
Aeseir
  • 6,726
  • 9
  • 51
  • 98