【问题标题】:Aurelia - no access to router in child router with viewportsAurelia - 无法访问具有视口的子路由器中的路由器
【发布时间】:2018-04-05 15:50:26
【问题描述】:

我有一个奇怪的问题,似乎没有找到问题所在。我有一个带有两个视口的子路由器,并且想在通过视口加载的组件(菜单)之一中访问路由器。当我使用 app.ts 中的视口定义相同的路由时,菜单会显示路由条目,但是在子路由器中定义的路由中,路由器变量是未定义的。我尝试使用菜单的视图模型并将路由器显式绑定到路由器视图标签,但没有运气。

如果有人能对此有所了解,那就太好了。

这样做的原因是,与管理页面相比,我想使用这些视口创建不同的页面布局。但是我不确定这种分离是否真的是一个好的方法。也许我可以简单地将管理页面的侧视口设置为空。但我相信这需要一些 CSS 重写。

app.ts

config.map([
      {
        route: ['', 'child'],
        name: 'child',
        moduleId: 'child/child',
      },
      {
        route: 'admin',
        name: 'admin',
        moduleId: 'admin/admin,
      },
    ]);

this.router = router;

子视图

<template> 
  [...]
  <router-view name="side"></router-view>

  <router-view name="main"></router-view>
</template>

子虚拟机

export class Child{
  private router: Router

  private configureRouter(config: RouterConfiguration, router: Router){
    config.map([
      {
        route: 'myOrders',
        name: 'myOrders',
        nav: true,
        viewPorts: {
          main: { moduleId: 'components/some-vm/some-vm' },
          side: { moduleId: 'components/menu/menu.html' }
        }
      },
      {
        route: ['', 'allorders'],
        name: 'allorders',
        nav: true,
        viewPorts: {
          main: { moduleId: 'components/orders-table/orders-table' },
          side: { moduleId: 'components/menu/menu.html' }
        }
      }
    ]);

    this.router = router;
  }
}

菜单视图

<template> 
  [...]
  ${router}  <!-- router is never accessible -->
  <ul class="nav">
    <li repeat.for="row of router.navigation" class="${row.isActive ? 'active' : ''}">
      <a href.bind="row.href">${row.title}</a>
    </li>
  </ul>
</template>

【问题讨论】:

  • 听起来不是最佳方法。考虑使用 compose。

标签: typescript aurelia


【解决方案1】:

router-view 中的绑定上下文未与父绑定上下文合并。您可能可以使用$parent.router(未对此进行测试),但最好在菜单视图的构造函数中简单地注入Router

澄清一下:每个子路由器都会有自己的子容器。由该子路由器加载的组件将从该子容器解析其依赖项。 RouterElement 之类的东西会自动注册到该子容器,这意味着您将始终获得相对于您从中请求它的组件的“最里面”或“最近”的实例。

因此,如果您在 App 中注入 Router,您将获得根 (AppRouter),如果您在菜单视图中注入它,您将获得所需的子路由器。

【讨论】:

  • 感谢您的澄清。我想我已经尝试过注入路由器,但不太确定。有时间我会试一试的。谢谢。
  • 您需要注意的主要事情是注入的路由器将是加载您要注入的 ViewModel 的路由器,而您从 configureRouter() 获得的路由器将是注入的路由器。他们不是同一个人。您可能已经尝试在您的根(应用程序)中注入路由器,但这永远不会奏效,因为应用程序是创建根路由器的那个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-03
  • 2017-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多