【发布时间】:2018-08-10 22:51:16
【问题描述】:
我什至不知道如何命名我遇到的问题。我也想避免使用辅助路线。我一直在尝试在 Angular 应用程序中创建类似两步路由的东西。
理论上,这应该是嵌套路由。但我认为假设是,如果您使用无组件路由,则子路由将路由到父插座,这是行不通的。在每个功能路线中使用相同的组件是解决方案 #2。我想要介于两者之间的东西,它是所有无组件子路由的相同“包装器”。
外部路由
外层路由器有2条路由:
-
/login:显示登录组件 - 其他所有内容都应包装在应用程序外壳中。 app shell 是一个带有侧边栏、导航栏和路由器插座的组件,所有实际内容都应该放在其中
内部路由
应用程序有多个功能模块,理想情况下,每个模块都应定义其路由。一个示例可能是用户个人资料:
-
/profile/settings: 显示shell里面的设置 -
/profile/account:在 shell 中显示帐户详细信息
解决方案 1
为每个模块定义一个通用的路由模块,例如AppRoutingModule:
const routes: Routers = [
{ path: 'login', component: LoginComponent },
{ path: '', component: AppShellComponent, children: [...] }
]
这限制了我进行适当的分离或使用延迟加载等功能。
https://stackblitz.com/edit/angular-routing-solution1
解决方案 2
在每个路由模块上使用AppShellComponent,例如ProfileRoutingModule
const routes: Routes = [
{ path: 'profile', component: AppShellComponent, ... }
]
这更接近解决方案,但现在我有多个 AppShellComponent 实例,这意味着每次应用程序从一个模块导航到另一个模块时需要额外的资源和重新加载。
https://stackblitz.com/edit/angular-routing-solution2
解决方案 3
封装了登录和外壳组件的组件。它知道应用程序是否已登录并显示模板的适当部分。这将被路由到''。这违背了我试图提出的解决方案的目的。
有我缺少的解决方案吗? :/
【问题讨论】:
-
您将什么定义为“次要”路线?
-
二级出口,由角度angular.io/guide/router#secondary-routes定义。这基本上是在与主要出口相同的水平上添加第二个出口,例如
/login(popup: wrong-password) -
两步路由是什么意思?您的两种解决方案都没有意义。在解决方案 1 中,您想对所有模块使用相同的路由文件吗?解决方案 2 您想对所有路由使用相同的组件吗?解决方案 3 听起来您不了解路由的工作原理以及何时使用它们。所有的解决方案都没有意义。
-
@LogicDev 很难解释您不知道术语或不完全理解的问题。我有一个非常具体的问题,它有一个非常具体的解决方案。在解决方案 1 中,如果我没有使用
loadChildren,那么是的,我必须在同一个文件中列出所有子项,因为一次只有 1 个路由匹配。在解决方案 2 中,我仍然需要用外壳包裹每个内页,因此我必须重复使用相同的组件。解决方案3,显然在路由方面是错误的,但可以在没有路由的情况下解决问题。