I want to achieve something like this /products
shows all the products and /products/:category
shows all the products related to a specific categor
you can solve it by adding routes
const routes: Routes = [
{ path: 'experience',
children: [
{ path: 'pending', component: ExperienceComponent },
{ path: 'requests', component: ExperienceComponent },
] }]
and in ExperienceComponent import
import { ActivatedRoute } from "@angular/router";
and in constructor add this parameter
constructor(public route: ActivatedRoute)
and inside constructor get url
this.route.url.subscribe(params => {
console.log(params[0].path);
})
I don't know if there is another way to do this but I managed to make it work using the following hack.
export const productsRoutes: Route[] = [
{
path: 'products',
component: ProductsComponent,
children: [
{
path: '',
pathMatch: 'prefix',
component: ProductsListComponent,
children: [
{
path: '',
component: EmptyComponent,
},
{
path: ':category',
component: EmptyComponent,
},
],
},
],
},
];
EmptyComponent:
import { Component } from '@angular/core';
@Component({
selector: 'GemainEmpty',
template: '<router-outlet></router-outlet>',
})
export class EmptyComponent {
}
Handle route changes on the ListComponent:
ngOnInit() {
this.routerEventsSubscription = this.router.events.subscribe((evt) => {
if (!(evt instanceof NavigationEnd)) {
return;
}
//Code to reload/filter list
}
}
And add a router outlet on the ListComponent template.
You could also define a redirect to a specific path:
{ path: '**', redirectTo: '/home', pathMatch: 'full' },
where /home
is the route you want to redirect to.
path: '**'
resolves all paths which are not defined
You can solve it by using redirect,
const productsRoutes: Routes = [
{
path: 'products',
component: ProductsComponent,
children: [
{
// path => '/products'
path: '',
redirectTo: ':category',
},
{
// path => '/products/:category'
path: ':category',
component: ProductsListComponent
}
]
}
];
It's more like set one path default, unless there is a matching path.