How do I navigate to a sibling route?
AngularAngular2 RoutingAngular2 RouterAngular Problem Overview
Let's presume I got this router config
export const EmployeeRoutes = [
{ path: 'sales', component: SalesComponent },
{ path: 'contacts', component: ContactsComponent }
];
and have navigated to the SalesComponent
via this URL
/department/7/employees/45/sales
Now I'd like to go to contacts
, but as I don't have all the parameters for an absolute route (e.g. the department ID, 7
in the above example) I'd prefer to get there using a relative link, e.g.
[routerLink]="['../contacts']"
or
this.router.navigate('../contacts')
which unfortunately doesn't work. There may be an obvious solution but I'm not seeing it. Can anyone help out here please?
Angular Solutions
Solution 1 - Angular
If you are using the new router (3.0.0-beta2), you can use the ActivatedRoute to navigate to relative path as follow:
constructor(private router: Router, private r:ActivatedRoute) {}
///
// DOES NOT WORK SEE UPDATE
goToContact() {
this.router.navigate(["../contacts"], { relativeTo: this.r });
}
Update 08/02/2019 Angular 7.1.0
current route: /department/7/employees/45/sales
the old version will do: /department/7/employees/45/sales/contacts
As per @KCarnaille's comment the above does not work with the latest Router. The new way is to add .parent
to this.r
so
// Working(08/02/2019)
// DOES NOT WORK SEE UPDATE
goToContact() {
this.router.navigate(["../contacts"], { relativeTo: this.r.parent });
}
the update will do: /department/7/employees/45/contacts
Update 12/12/2021 Angular > 10
As @ziz194 mention it, this is how it now works.
constructor(private router: Router, private r:ActivatedRoute) {}
goToContact() {
this.router.navigate(["contacts"], { relativeTo: this.r });
}
Solution 2 - Angular
The RouterLink directive always treats the provided link as a delta to the current URL:
[routerLink]="['/absolute']"
[routerLink]="['../../parent']"
[routerLink]="['../sibling']"
[routerLink]="['./child']" // or
[routerLink]="['child']"
// with route param ../sibling;abc=xyz
[routerLink]="['../sibling', {abc: 'xyz'}]"
// with query param and fragment ../sibling?p1=value1&p2=v2#frag
[routerLink]="['../sibling']" [queryParams]="{p1: 'value', p2: 'v2'}" fragment="frag"
The navigate()
method requires a starting point (i.e., the relativeTo
parameter). If none is provided, the navigation is absolute:
constructor(private router: Router, private route: ActivatedRoute) {}
this.router.navigate(["/absolute/path"]);
this.router.navigate(["../../parent"], {relativeTo: this.route});
this.router.navigate(["../sibling"], {relativeTo: this.route});
this.router.navigate(["./child"], {relativeTo: this.route}); // or
this.router.navigate(["child"], {relativeTo: this.route});
// with route param ../sibling;abc=xyz
this.router.navigate(["../sibling", {abc: 'xyz'}], {relativeTo: this.route});
// with query param and fragment ../sibling?p1=value1&p2=v2#frag
this.router.navigate(["../sibling"], {relativeTo: this.route,
queryParams: {p1: 'value', p2: 'v2'}, fragment: 'frag'});
// RC.5+: navigate without updating the URL
this.router.navigate(["../sibling"], {relativeTo: this.route, skipLocationChange: true});