【问题标题】:How to use a different router outlet for different routes in angular 2如何在角度 2 中为不同的路由使用不同的路由器插座
【发布时间】:2017-04-19 21:05:08
【问题描述】:

目前,我正在使用 Angular 2 开发一个 Web 应用程序。

我的应用程序的基础实际上是这个:github.com/ngrx/example-app

布局的父容器是这个: github.com/ngrx/example-app/blob/master/src/app/containers/app.ts

在我的一个用例中,我想要一个特定的路径来引导一个页面,其中整个布局不会相同。我需要一个几乎没有 chrome 的页面,以后可以将其存储为屏幕截图,因此对于这种情况,菜单栏是多余的。

这是容器的模板:

 <bc-layout>
  <bc-sidenav [open]="showSidenav$ | async">
    <bc-nav-item (activate)="closeSidenav()" routerLink="/" icon="book" hint="View your book collection">
      My Collection
    </bc-nav-item>
    <bc-nav-item (activate)="closeSidenav()" routerLink="/book/find" icon="search" hint="Find your next book!">
      Browse Books
    </bc-nav-item>
  </bc-sidenav>
  <bc-toolbar (openMenu)="openSidenav()">
    Book Collection
  </bc-toolbar>
  <router-outlet></router-outlet>
</bc-layout>

我的问题是我不知道如何让应用程序组件为特定路由使用不同的路由器插座。首先,注入到 AppComponent 实例中的 ActivatedRoute 与路由的目标组件访问的实际 ActivatedRoute 不同(即为空),design。这意味着在 AppComponent 中我什至无法匹配 url,因为它是空的。

我还尝试手动将一个字段设置为具有时间延迟的值,然后将此字段用作在两个路由器插座之间切换的条件。第一个出口在布局内部,而另一个在外部(因此它会在没有花里胡哨的情况下呈现)。这也不起作用,因为似乎路由器出口只设置了一次,当应用程序组件首次加载时,然后其他路由器出口不会发生渲染。

总而言之,我想要以下内容(尽管替代解决方案可能效果更好):

 <bc-layout>
  <bc-sidenav [open]="showSidenav$ | async">
    <bc-nav-item (activate)="closeSidenav()" routerLink="/" icon="book" hint="View your book collection">
      My Collection
    </bc-nav-item>
    <bc-nav-item (activate)="closeSidenav()" routerLink="/book/find" icon="search" hint="Find your next book!">
      Browse Books
    </bc-nav-item>
  </bc-sidenav>
  <bc-toolbar (openMenu)="openSidenav()">
    Book Collection
  </bc-toolbar>
  <router-outlet></router-outlet>
</bc-layout>
   <router-outlet></router-outlet> <---chromeless outlet

【问题讨论】:

  • 如果您想在同一个组件中使用多个路由器插座,您可以使用named router outletHere's 也是一篇很好的文章。
  • 这个问题是我需要它在根容器 AppComponent 中,因为这是定义布局的地方。这意味着我必须定义子路线。什么是父母和孩子的路线?目前我有 { path: 'cube/analytics/:id/:algorithm/embed/:part', canActivate: [ CubeExistsGuard ], component: CubeAnalyticsEmbedPage }

标签: angular angular2-routing


【解决方案1】:

如果我理解正确,那么您需要定义子路由,因此您有多个路由器插座。

请在此处阅读子路线的工作原理。

https://angular-2-training-book.rangle.io/handout/routing/child_routes.html

【讨论】:

  • 是的,我也想过这个,但是,什么是父组件,什么是子组件?这是当前路线:{ path: 'cube/analytics/:id/:algorithm/embed/:part', canActivate: [ CubeExistsGuard ], component: CubeAnalyticsEmbedPage }
  • 父组件始终是您定义路由器插座的组件。路由中定义的子路由将显示在该父路由出口中。如果您想在一个组件中使用多个路由器插座,则需要使用辅助路由器插座。
  • 所以我重构了我的路线。我将它们全部设为 LayoutComponent(包含菜单的那个)的所有子元素,但应该是无铬元素的除外。我还在 LayoutComponent 中添加了一个路由器插座,并将所有 chrome 移动到 LayoutComponent 中。现在,LayoutComponent 子级之外的路由仅使用 AppComponent 中的路由器插座进行渲染,因此它呈现无镶边。谢谢!
猜你喜欢
  • 1970-01-01
  • 2018-07-28
  • 2021-03-13
  • 1970-01-01
  • 2020-01-13
  • 2023-04-01
  • 2018-03-07
  • 1970-01-01
  • 2016-12-30
相关资源
最近更新 更多