Let's say I have the following setup:
employee -------+ employee.module.ts
| employee.routing.ts
+ employee.component.ts
|
sales ----------+ sales.module.ts
| sales.routing.ts
+ sales.component.ts
app.module.ts
app.routing.ts
app.component.ts
and I'd like my routes to look like
employee/14/sales
So I go ahead and define these routing declarations:
app.routing.ts
...
import { AppComponent } from './app.component';
const appRoutes: Routes = [
{ path: '', component: AppComponent }
];
export const appRoutingProviders: any[] = [];
export const routing = RouterModule.forRoot(appRoutes, { useHash: true });
employee.routing.ts
...
import { EmployeeComponent } from './employee.component';
export const employeeRoutes: Routes = [
{ path: 'employee/:id', component: EmployeeComponent }
];
export const employeeRouting = RouterModule.forChild(employeeRoutes);
sales.routing.ts
...
import { SalesComponent } from './sales.component';
export const salesRoutes: Routes = [
{ path: 'sales', component: SalesComponent }
];
export const salesRouting = RouterModule.forChild(salesRoutes);
while my modules take this form:
app.module.ts
import { EmployeeModule } from './employee/employee.module';
import { AppComponent } from './app.component';
import {
routing,
appRoutingProviders
} from './app.routing';
@NgModule({
imports: [
...
EmployeeModule,
routing
],
declarations: [
AppComponent
],
bootstrap: [
AppComponent
],
providers: [
appRoutingProviders
]
})
employee.module.ts
import { SalesModule } from '../sales/sales.module';
import { EmployeeComponent } from './employee.component';
import { employeeRouting } from './employee.routing';
@NgModule({
imports: [
SalesModule,
employeeRouting
],
declarations: [
EmployeeComponent
]
})
sales.module.ts
import { SalesComponent } from './sales.component';
import { salesRouting } from './sales.routing';
@NgModule({
imports: [
salesRouting
],
declarations: [
SalesComponent
]
})
export class SalesModule {}
I can now move to
employee/14
but if I try to navigate to
employee/14/sales
I'm greeted with
Error: Cannot match any routes: 'employee/14/sales'
I can, however, enter
sales
and that works while it isn't supposed to work, so somehow all routes connect directly to /
instead of building on top of each other.
What am I missing?
EDIT plnkr demonstrating the issue can be found here.
I eventually got this to work. The key idea is not to include employeeRoutes
from employee.routing.ts
(as that will add stuff from EmployeeModule
to AppModule
s declarations and result in yet another error message) but instead to create another employeeRoutes
inside app.routing.ts
that will lazy load EmployeeModule
when navigating to a route starting with`
/employee
Here's the relevant code:
import {
RouterModule,
Routes
} from '@angular/router';
import { AppComponent } from './app.component';
const employeeRoutes: Routes = [
{
path: 'employee',
loadChildren: 'app/employee/employee.module#EmployeeModule'
}
];
const appRoutes: Routes = [
{ path: '', redirectTo: 'welcome', pathMatch: 'full' },
...employeeRoutes
];
export const appRoutingProviders: any[] = [];
export const routing = RouterModule.forRoot(appRoutes, { useHash: true });
The full plnkr can be found here.
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