Angular 10 个组件未加载到路由器插座中
Angular 10 components not loading in router-outlet
在 Angular10 中构建新应用时,我遇到了组件未按预期加载的问题。
样板代码或多或少直接从我在 Angular 9 中制作的另一个项目中复制,在那里它工作得很好,虽然我似乎记得在某个时候遇到过类似的问题,但不记得解决方案.
问题简述
只有 AppComponent
正在加载。该组件有一个 router-outlet
应该加载 ShellComponent
及其子组件通过 ShellService
.
注入
URL 重定向有效,因为我在启动时按预期被重定向到 /cases/current
,所以我知道所有模块都已正确加载。
我有什么tried/researched
我查看了 Angular 10 的文档,看看版本 9 是否有任何可能导致此问题的更改,但找不到任何相关的内容。
我尝试禁用 Ivy、禁用 AOT 和禁用构建优化以查看它是否有任何不同 - 结果没有。
我还尝试从 ShellModule
中导出 ShellComponent
并将其直接加载到 AppComponent
HTML 中,这导致 ShellComponent
出现, 但仍然没有子组件。
最终分辨率
多亏了下面的答案,我才能够创建一个有效的解决方案。 StackBlitz link 对于任何感兴趣的人。
您需要在 app-routing.module
中提供与这些模块相关的路由,我猜您想延迟加载这些模块,将您的 app-routing.module
修改为:
const routes: Routes = [
{ path: '*', redirectTo: '', pathMatch: 'full' },
{
path: 'shell', loadChildren: () => import('./shell/shell.module').then(m => m.ShellModule)
}
案例模块也是如此
祝你好运!
第一个问题是您没有在任何地方布线或放置 shell 组件。你可以在 app.component.html
中将 router-outlet 替换为 <app-shell></app-shell>
。如果您选择这样做,则需要从模块中导出 shell 组件。或者,您可以按照 Alejandro Camba 在另一个答案中描述的方式路由到 shell。
第二个问题是您没有将路由导入应用程序模块,因此即使您路由到 cases/current,也没有向路由器注册任何内容来加载当前案例组件。最佳做法是在 app-routing.module.ts
中延迟加载功能路由
const routes: Routes = [
{
path: 'cases',
loadChildren: () => import('./cases/cases.module').then(m => m.CasesModule)
},
{ path: '**', redirectTo: '', pathMatch: 'full' }
];
@NgModule({
imports: [RouterModule.forRoot(routes, { enableTracing: false })],
exports: [RouterModule],
})
export class AppRoutingModule {}
然后,您可以更新案例模块的路由以包含当前案例组件路由:
const routes: Routes = [
{ path: '', redirectTo: 'current', pathMatch: 'full' },
{
path: 'current',
component: CurrentCasesComponent,
},
];
之所以可行,是因为“cases”路由到 cases 模块,而“current”将路由到 CurrentCasesComponent。
在 Angular10 中构建新应用时,我遇到了组件未按预期加载的问题。
样板代码或多或少直接从我在 Angular 9 中制作的另一个项目中复制,在那里它工作得很好,虽然我似乎记得在某个时候遇到过类似的问题,但不记得解决方案.
问题简述
只有 AppComponent
正在加载。该组件有一个 router-outlet
应该加载 ShellComponent
及其子组件通过 ShellService
.
URL 重定向有效,因为我在启动时按预期被重定向到 /cases/current
,所以我知道所有模块都已正确加载。
我有什么tried/researched
我查看了 Angular 10 的文档,看看版本 9 是否有任何可能导致此问题的更改,但找不到任何相关的内容。
我尝试禁用 Ivy、禁用 AOT 和禁用构建优化以查看它是否有任何不同 - 结果没有。
我还尝试从 ShellModule
中导出 ShellComponent
并将其直接加载到 AppComponent
HTML 中,这导致 ShellComponent
出现, 但仍然没有子组件。
最终分辨率
多亏了下面的答案,我才能够创建一个有效的解决方案。 StackBlitz link 对于任何感兴趣的人。
您需要在 app-routing.module
中提供与这些模块相关的路由,我猜您想延迟加载这些模块,将您的 app-routing.module
修改为:
const routes: Routes = [
{ path: '*', redirectTo: '', pathMatch: 'full' },
{
path: 'shell', loadChildren: () => import('./shell/shell.module').then(m => m.ShellModule)
}
案例模块也是如此
祝你好运!
第一个问题是您没有在任何地方布线或放置 shell 组件。你可以在 app.component.html
中将 router-outlet 替换为 <app-shell></app-shell>
。如果您选择这样做,则需要从模块中导出 shell 组件。或者,您可以按照 Alejandro Camba 在另一个答案中描述的方式路由到 shell。
第二个问题是您没有将路由导入应用程序模块,因此即使您路由到 cases/current,也没有向路由器注册任何内容来加载当前案例组件。最佳做法是在 app-routing.module.ts
中延迟加载功能路由const routes: Routes = [
{
path: 'cases',
loadChildren: () => import('./cases/cases.module').then(m => m.CasesModule)
},
{ path: '**', redirectTo: '', pathMatch: 'full' }
];
@NgModule({
imports: [RouterModule.forRoot(routes, { enableTracing: false })],
exports: [RouterModule],
})
export class AppRoutingModule {}
然后,您可以更新案例模块的路由以包含当前案例组件路由:
const routes: Routes = [
{ path: '', redirectTo: 'current', pathMatch: 'full' },
{
path: 'current',
component: CurrentCasesComponent,
},
];
之所以可行,是因为“cases”路由到 cases 模块,而“current”将路由到 CurrentCasesComponent。