如何使命名路由出口与 loadChildren 一起工作?

2024-01-04

我创建了两个关于路由的 loadChildren 和出口导航问题的插件。由于某种原因,加载的子模块中具有空的基本路径不适用于出口导航。

In this https://plnkr.co/edit/ps0ZiD3mHTte227Ws69T?p=preview例如,按“联系”链接失败。

应用程序路由模块

const appRoutes: Routes = [
  { path: 'admin', loadChildren: () => AdminModule },
  { path: '',   redirectTo: '/admin', pathMatch: 'full' }
];

管理路由模块

const adminRoutes: Routes = [
{ 
  path: '', 
  component: AdminComponent,
  children: [ 
    {
      path: 'compose',
      component: ComposeMessageComponent,
      outlet: 'popup'
    }
  ]
}];

In this https://plnkr.co/edit/HrsFvUuPgo9KvlDQJ9uk?p=preview例如,按“联系”链接即可。

应用程序路由模块

const appRoutes: Routes = [
  { path: 'admi', loadChildren: () => AdminModule },
  { path: '',   redirectTo: '/admi/n', pathMatch: 'full' }
];

管理路由模块

const adminRoutes: Routes = [
{ 
  path: 'n', 
  component: AdminComponent,
  children: [ 
    {
      path: 'compose',
      component: ComposeMessageComponent,
      outlet: 'popup'
    }
  ]
}];

区别在于 app-routing.module 和 admin-routing.module。该工作示例没有 admin-routing.module 的空路径。 根据文档 https://angular.io/docs/ts/latest/guide/router.html#!#asynchronous-routing有一个空路径应该可以。


“Contact”的 routerLink 指令的链接参数数组的第一段是指包含 routerLink 的组件模板的父路由和相应的 router-outlet。您需要将指定路由器出口的路由配置放置在应用程序路由配置中,而不是“失败”场景的管理路由配置中,但这可能是不可取的,因为与其他原则之间的关注点分离。

您提供的第一个示例“失败”和第二个示例“有效”之间的区别在于,路由配置中的角度路由器redirectTo在路由模式匹配期间“回溯”的方式;然而,第二个关键方面是作为匹配结果评估的行为不应该影响路由的模式匹配的行为。

在“失败”场景中,路由段“”被匹配,redirectTo将url更改为“/admin”,路由器匹配路径“/admin”,路由器自动匹配admin-routing配置中的空字符串“”,路由完成。在第二个“成功”场景中,路径匹配“”,redirectTo匹配第一段“/admi”,路由器评估url的第二段“/n”,因为路由尚未完成,路由器在app-routing 配置匹配 '/n' 并且没有找到任何匹配项,然后评估 admin-routing 配置并匹配第二段 '/n',路由器自动匹配空字符串 '' 路由完成。 “失败”场景问题是链接参数数组<a [routerLink]="[{ outlets: {popup: ['compose']}}]">Contact</a>是一个空字符串,并且 url 当前为“/admin”。是的,关键区别在于路由器自动评估的空“”字符串在层次结构中出现的位置,换句话说,路由器评估路由配置完成的位置。这很微妙,但在“失败”场景中评估的空字符串在顶层 AdminComponent 完成;因此,路由器模式匹配回溯会自动在父路由“admin”处查找空字符串“”,这是应用程序路由路由配置中的“redirectTo”的结果。在第二个“成功”场景中,路由器对路由配置的评估在父“/n”的子路径“”处完成,与管理路由路由配置“失败”场景相比,该子路径在层次结构中处于较低级别;因此,在第二个“成功”场景中,当<a [routerLink]="['', { outlets: {popup: ['compose']}}]">Contact</a>被点击。

为了修复“失败”场景路由配置,您需要修改 Contact routerLink 指令的 links 参数数组的第一段以指定管理路径,即<a [routerLink]="['/admin', { outlets: {popup: ['compose']}}]">Contact</a>,或修改由路由器完成自动评估的空字符串 '' 路径出现的层次结构。

要通过修改路由配置层次结构来“修复”由路由器自动评估的空字符串“路径”的父级,请务必注意,空字符串“路径”的父级不能是空字符串“ ' 小路。在示例中:

const devNavRoutes: Routes = [
  {
    path: '',
    component: DevNavContainerComponent, canActivate: [ DevNavAuthGuard1Service ],
    children: [
      { path: '', canActivateChild: [ DevNavAuthGuard1Service ],
        children: [
          { path: '', redirectTo: 'dashboard' },
          { path: 'dashboard', component: DevNavDashboardComponent,
            children: [
              { path: ':auxiliaryId', component: DevNavAuxiliaryComponent, outlet: 'auxiliary'},
              { path: ':ancillaryId', component: DevNavAncillaryComponent, outlet: 'ancillary' }
            ] },
          { path: ':id', component: DevNavDashboardComponent,
            children: [
              { path: ':auxiliaryId', component: DevNavAuxiliaryComponent, outlet: 'auxiliary'},
              { path: ':ancillaryId', component: DevNavAncillaryComponent, outlet: 'ancillary' }
            ] },
        ] },
    ] } 
];

Note:

// dev-nav-container.component
<router-outlet></router-outlet>

And

// dev-nav-dashboard.component
<router-outlet name="auxiliary"></router-outlet> 
<router-outlet name="ancillary"></router-outlet>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使命名路由出口与 loadChildren 一起工作? 的相关文章

随机推荐

  • Java/GWT/MySQL:连接被拒绝?

    我正在开发一个 GWT Web 应用程序 并尝试从我的 RemoteServiceServlet 实现 用于 rpc 连接到 mysql 数据库 服务器运行 我可以从我工作的机器连接到数据库 出于测试目的 我编写了一个仅连接到数据库的小程序
  • Firebase 获取 - 无访问控制允许来源

    我正在开发一个应用程序React Redux我有我的JSON数据库内FirebaseD B 为了做到这一点 我正在尝试fetch我的数据来自有效的 URL 通过 Firebase 模拟器验证 let firebase https fireb
  • Azure存储表-插入批量行并检查它们是否存在

    我发送对某些服务的查询并返回结果 我想知道我过去是否已经得到了相同的 答案 所以 我打算使用Azure Table作为缓存机制 我做了这个小 POC TableBatchOperation batchOperation new TableB
  • 如何以编程方式运行 Java 应用程序中的所有 JUnit 测试?

    通过 Eclipse 我可以轻松运行应用程序中的所有 JUnit 测试 我希望能够从应用程序 jar 在目标系统上运行测试 而无需 Eclipse 或 Ant 或 Maven 或任何其他开发工具 我可以看到如何从命令行运行特定的测试或套件
  • 如何使用pyInstaller完整打包所有必需的库?

    我已经使用 pyinstaller 创建了我的 python 应用程序的独立应用程序 pyinstaller windowed app py 它实际上在我的计算机上运行并且按预期工作 但是当我在我朋友的计算机上尝试它时 它不起作用 它运行但
  • 选择表列名称作为值[重复]

    这个问题在这里已经有答案了 给定一个具有任意数量的记录 X 和任意数量的列 Y 的 SQL 表 RecordID Column1 Column 2 Column 3 Column Y 1 Value11 Value12 Value13 Va
  • DPI 无法正确缩放

    我创建了一个自定义 UserControl 其功能与 numbericUpDown 非常相似 但具有各种增强功能 例如 它可以显示分数 但是 此控件的缩放比例不如窗体上的其他一些控件 这迫使我的 UI 看起来很尴尬 我尝试了控件及其父控件的
  • 片段 onHiddenChanged 未调用

    我最近将 Fragments 添加到我的应用程序中 对于新的应用程序 我需要获得 显示我的片段后立即通知 所以我可以尽快做一些计算 片段再次显示 我的 Fragment 与 TabIndicator 一起使用 并且仅使用一个 Fragmen
  • REXML::Document.new 我们可以在这一行给出编码参数吗?

    doc REXML Document 新文件 每当我的 xml 文件包含 UTF 8 以外的一些特殊字符时 我的代码就会失败 REXML ParseException
  • 在配置私有 GKE 集群时了解 --master-ipv4-cidr

    我试图进一步了解当我在 Google 的 Kubernetes Engine 中配置私有集群时到底发生了什么 Google 在此提供了一个配置私有集群的示例 其中控制平面服务 例如 Kubernetes API 位于172 16 0 16
  • 如何获取访问Google Play开发者API的授权

    我正在尝试访问 Google Play 开发者 APIhttps developers google com android publisher https developers google com android publisher 为
  • 以编程方式在 WinForms VB.NET/C# 中聚焦/突出显示 ListView 列标题

    在 WinForms ListView 上 将鼠标悬停在列标题上会导致其聚焦或强调 例如 我需要动态地执行此操作 因为在我的程序中使用左右键切换焦点列 尽管广泛搜索了以下属性 ListView Columns i ListView Colu
  • Haskell 在现实世界中的用途是什么? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 关于 Haskell 有很多炒作 但是 很难获得有关如何在现实世界应用程序中使用它的信息 Haskell 最流行的项目 用法是什么 为什么它擅长
  • typeahead.js 预取不起作用

    我无法让 typeahead js 中的预取函数工作 但它对于本地数据工作得很好 我首先尝试链接到返回 json 对象或列表的 servlet 但过了一会儿我放弃了 并开始检查提供的示例 因此 他们的示例链接到的页面如下所示 http tw
  • 每 10 秒调用一个函数 Angular2

    我正在尝试创建一个Timer这称为API call每 10 秒 我使用setTimeOut但问题是 它变成了无限循环 即使我推送到另一个页面 它也会继续加入 if 条件 例子 我在启动 10 秒 API 调用的方法上调用此方法 setTim
  • 将字典从 Swift 发送到 PHP

    如何将 Swift 生成的字典作为 PHP URL 中的参数发布 具体来说 任务是更新托管数据库上的许多字段 我不是将每个字段的新值定义为单独的参数 而是希望传递一个字典 其中键是字段名称 值是新值 该数据已经作为Dictionary
  • c++:程序设置 - boost.PropertyTree 还是 boost.program_options?

    我正在寻找一种在 C 中存储程序设置或选项或配置的解决方案 这些可能是在 GUI 中公开的设置 需要在代码运行之间保存 在我的搜索中我遇到了boost PropertyTree http www boost org doc libs 1 4
  • Matlab 中的矩阵到向量转换

    我有一个 MxN 矩阵 想转换为向量 MNx1 其中矩阵中行的所有元素作为向量的元素 我尝试使用reshape但我没有成功 这是小代码片段和预期结果 S 0 1 1 0 1 1 1 1 预期结果 S prime 0 1 1 0 1 1 1
  • 是否有使用 sun.jdbc.odbc.JdbcOdbcDriver 的替代方法? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我最近将我们工作中的一个旧应用程序从 Java 1 5 迁移到 1 6 我注意到在构建过程中 我现在收
  • 如何使命名路由出口与 loadChildren 一起工作?

    我创建了两个关于路由的 loadChildren 和出口导航问题的插件 由于某种原因 加载的子模块中具有空的基本路径不适用于出口导航 In this https plnkr co edit ps0ZiD3mHTte227Ws69T p pr