问题
I have a main module and some submodules. And I want to specify some not trivial routing between them.
I'd prefer defining the routes of a submodule within the submodule. E.g.:
@NgModule({
imports: [
/*...*/
RouterModule.forChild([
{ path: 'country', redirectTo: 'country/list' },
{ path: 'country/list', component: CountryListComponent },
{ path: 'country/create', component: CountryCreateComponent },
/*...*/
])
],
declarations: [/*...*/],
exports: [
RouterModule,
],
})
export class CountryModule {}
I want to import this module with its own internal routing, but I want to make its whole routing prefixed.
const appRoutes = [
{ path: '', component: HomeComponent },
/*... (basic routes)*/
];
@NgModule({
imports: [
/*...*/
RouterModule.forRoot(appRoutes),
CountryModule, // <- how to make its routing prefixed??
],
declarations: [
/*...*/
AppComponent,
],
bootstrap: [ AppComponent ]
})
export class AppModule {}
This settings creates the following routes: /country
, /country/list
, etc., but I want to make them prefixed like this:
/settings/country
/settings/country/list
/settings/country/create
There are other modules that I want to access via another routing, e.g. a CityModule
under /otherstuff/city/create
and /otherstuff/city/list`.
My questions:
- Is it possible to import a module with its own routing and make its routes prefixed?
- Furthermore: Is there a way to make links between 2 submodules agnostically of their final (prefixed) routes?
UPDATE
The accepted answer is the best way to do it: create the routes in the module, register them externally. Thus you can modify the routes, e.g. prefix them (this is what I wanted), you can define guards, override or filter them, etc.
回答1:
in your appRoutes add child route like
const appRoutes = [
{ path: '', component: HomeComponent },
{
path: 'settings',
component: CountryComponent,
canActivate: [AuthGuard],
children: COUNTRY_ROUTES
},
];
Create a separate routes file
export const COUNTRY_ROUTES:Routes = [
{ path: 'country', redirectTo: 'country/list' },
{ path: 'country/list', component: CountryListComponent },
{ path: 'country/create', component: CountryCreateComponent },
];
In CountryComponent.html
<router-outlet></router-outlet>
回答2:
Playing with this Routing stuff I just found a clean way I would like to share, to handle the routes of submodules with no headaches and love Angular even more. Taking the OP case as an example, I propose you to study the following code:
Add a utility function to your CountryModule
submodule, to load it dynamically from the Router and avoid a compiler warning about replacing the arrow function with a reference to an exported function:
@NgModule({
imports: [
...
RouterModule.forChild([
{ path: 'country', pathMatch: 'full', redirectTo: 'list' },
{ path: 'country/list', component: CountryListComponent },
{ path: 'country/create', component: CountryCreateComponent },
])
],
declarations: [ ... ],
exports: [
RouterModule,
],
})
export class CountryModule {}
export function CountryEntrypoint() {
return CountryModule;
}
Now you can import that Entrypoint into your parent module where you want to place the routes:
@NgModule({
imports: [
...
RouterModule.forRoot([
{ path: '', pathMatch: 'full', component: HomeComponent },
{ path: 'settings', loadChildren: CountryEntrypoint }
]),
],
declarations: [AppComponent],
bootstrap: [AppComponent]
})
export class AppModule {}
And there you go!
You can now reach your submodule components with settings/country/list
and settings/country/list
.
WARNING
Be careful to not import the CountryModule
into your parent module's @NgModule
, because it will override the routes outside the settings
path. Let the router do the job.
Enjoy!
来源:https://stackoverflow.com/questions/41020569/angular2-routing-import-submodule-with-routing-making-it-prefixed