无需延迟加载即可路由到子路由模块
Routing to sub routing module without lazy loading
我想要多个 routing
模块,以保持我的应用程序简洁易读。我目前对 SubComponent
使用延迟加载,但我不想这样做。所以我正在寻找一种方法来改变这一点。无论如何,这是当前工作的代码。
我有以下两个路由文件。
app-routing.module.ts
:
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
const routes: Routes = [
{ path: '', component: HomeComponent },
{ path: 'sub', loadChildren: './sub/sub.module#SubModule' }
];
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule]
})
sub-routing.module.ts
:
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
const routes: Routes = [
{ path: '', component: SubComponent, children: [
{ path: 'new', component: SubEditComponent }
] },
];
@NgModule({
imports: [RouterModule.forChild(routes)],
exports: [RouterModule]
})
这种方式工作正常,但我不想对此应用延迟加载 SubComponent
。所以,理想情况下我想将 app-routing.module.ts
更改为:
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
const routes: Routes = [
{ path: '', component: HomeComponent },
{ path: 'sub', component: SubComponent }
];
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule]
})
这将不起作用并导致以下错误:
ERROR Error: Uncaught (in promise): Error: Cannot match any routes. URL Segment: 'sub/new'
Error: Cannot match any routes. URL Segment: 'sub/new'
SubComponent
的大小会大幅增长,出于我自己的原因我不想应用延迟加载。那么无论如何,有没有办法在避免延迟加载的情况下使用多个路由文件?
你试过这样加载吗:
{ path: 'sub', loadChildren: () => SubModule }
您可以找到更多详细信息here。
您忘记声明到 new
的子路由
const routes: Routes = [
{ path: '', component: HomeComponent },
{
path: 'sub',
component: SubComponent,
children: [
{ path: 'new', component: SubEditComponent }
]
}
];
如果你想保留第二个路由模块那么
亚routing.module.ts
const routes: Routes = [
{ path: 'sub', component: SubComponent, children: [
{ path: 'new', component: SubEditComponent }
] },
];
sub.module.ts
@NgModule({
...
imports: [
...
SubRoutingModule,
app.module.ts
@NgModule({
imports: [
...,
AppRoutingModule,
SubModule
你可以像 eminlala 说的那样使用箭头函数,但如果你 运行 一个产品构建,它就不会工作。
{ path: 'sub', loadChildren: () => SubModule }
因此,为了使其在产品构建中工作,您需要创建一个导出函数,如下所示。
import SubModule from 'path-to-sub-module';
export function loadSubModule() {
return SubModule;
}
export const SUB_MODULE_ROUTING = {
path: 'sub',
loadChildren: loadSubModule,
};
我用这个conf创建一个文件并将其导入AppRoutingModule,但你可以把它写在AppRoutingModule里面。
希望对您有所帮助。
app.module.ts
@NgModule({
imports: [
...,
SubModule, /* subModule with routing, the order is very important */
AppRoutingModule, // put it at the end
]
}
路由模块的顺序很重要。
AppRoutingModule.ts
const routes: Routes = [
// filter path '**' will prevent routing to the subModule
{ path: '**', component: PageNotFoundComponent },
];
我想要多个 routing
模块,以保持我的应用程序简洁易读。我目前对 SubComponent
使用延迟加载,但我不想这样做。所以我正在寻找一种方法来改变这一点。无论如何,这是当前工作的代码。
我有以下两个路由文件。
app-routing.module.ts
:
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
const routes: Routes = [
{ path: '', component: HomeComponent },
{ path: 'sub', loadChildren: './sub/sub.module#SubModule' }
];
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule]
})
sub-routing.module.ts
:
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
const routes: Routes = [
{ path: '', component: SubComponent, children: [
{ path: 'new', component: SubEditComponent }
] },
];
@NgModule({
imports: [RouterModule.forChild(routes)],
exports: [RouterModule]
})
这种方式工作正常,但我不想对此应用延迟加载 SubComponent
。所以,理想情况下我想将 app-routing.module.ts
更改为:
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
const routes: Routes = [
{ path: '', component: HomeComponent },
{ path: 'sub', component: SubComponent }
];
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule]
})
这将不起作用并导致以下错误:
ERROR Error: Uncaught (in promise): Error: Cannot match any routes. URL Segment: 'sub/new'
Error: Cannot match any routes. URL Segment: 'sub/new'
SubComponent
的大小会大幅增长,出于我自己的原因我不想应用延迟加载。那么无论如何,有没有办法在避免延迟加载的情况下使用多个路由文件?
你试过这样加载吗:
{ path: 'sub', loadChildren: () => SubModule }
您可以找到更多详细信息here。
您忘记声明到 new
const routes: Routes = [
{ path: '', component: HomeComponent },
{
path: 'sub',
component: SubComponent,
children: [
{ path: 'new', component: SubEditComponent }
]
}
];
如果你想保留第二个路由模块那么
亚routing.module.ts
const routes: Routes = [
{ path: 'sub', component: SubComponent, children: [
{ path: 'new', component: SubEditComponent }
] },
];
sub.module.ts
@NgModule({
...
imports: [
...
SubRoutingModule,
app.module.ts
@NgModule({
imports: [
...,
AppRoutingModule,
SubModule
你可以像 eminlala 说的那样使用箭头函数,但如果你 运行 一个产品构建,它就不会工作。
{ path: 'sub', loadChildren: () => SubModule }
因此,为了使其在产品构建中工作,您需要创建一个导出函数,如下所示。
import SubModule from 'path-to-sub-module';
export function loadSubModule() {
return SubModule;
}
export const SUB_MODULE_ROUTING = {
path: 'sub',
loadChildren: loadSubModule,
};
我用这个conf创建一个文件并将其导入AppRoutingModule,但你可以把它写在AppRoutingModule里面。
希望对您有所帮助。
app.module.ts
@NgModule({
imports: [
...,
SubModule, /* subModule with routing, the order is very important */
AppRoutingModule, // put it at the end
]
}
路由模块的顺序很重要。
AppRoutingModule.ts
const routes: Routes = [
// filter path '**' will prevent routing to the subModule
{ path: '**', component: PageNotFoundComponent },
];