Angular2多个路由器出口在同一模板中


81

同一模板中可以有多个路由器出口吗?

如果是,那么如何配置路由?

我正在使用angular2 beta。


您到底想实现什么?子路线可以满足您的需求吗?看到此链接:angular.io/docs/ts/latest/guide/router.html# ! #child-router
Thierry Templier,2016年

我需要构建一个使用多个会话(选项卡)的应用程序,每个会话具有相同的内容(如浏览器选项卡)。
伊斯兰沙欣

检查路由器开发人员的谈话,看看当前有什么可能-> youtube.com/watch?v=z1NB-HG0ZH4如果我记得有子路由和辅助路由。
Angular大学

Answers:


55

是的,可以,但是您需要使用辅助路由。您将需要给路由器出口起个名字:

<router-outlet name="auxPathName"></router-outlet>

并设置您的路由配置:

@RouteConfig([
  {path:'/', name: 'RetularPath', component: OneComponent, useAsDefault: true},
  {aux:'/auxRoute', name: 'AuxPath', component: SecondComponent}
])

看看这个例子:http : //plnkr.co/edit/JsZbuR?p = preview 另外此视频:https : //www.youtube.com/watch?v= z1NB-HG0ZH4 &feature=youtu.be


RC.5辅助路由的更新有所更改:在路由器出口中使用一个名称:

<router-outlet name="aux">

在您的路由器配置中:

{path: '/auxRouter', component: secondComponentComponent, outlet: 'aux'}

1
顺便说一句,截至2016年1月,根据此资源,我们尚不应该使用aux,因为它尚未准备就绪github.com/angular/angular/issues/5027#issuecomment-169464546
Tomer Almog

感谢您的答复,我正在使用angular2 beta。我尝试定义辅助路由:{辅助:'/ edit-entity /:id',名称:'EditEntity',组件:EditEntityComponent}当我调用它不起作用时:this._router.navigate(['/' ,['EditEntity'],{id:id}]));
伊斯兰教Shaheen

确保在导航部分中包含完整的路线,而不是相对于您的组件。
Tomer Almog

4
更新:截至2016年5月,Angular2刚刚发布了他们的RC(候选版本),现在应该可以使用辅助路由。
Tomer Almog

3
以1票赞成RC5的最新答案。Angular2变化如此之快。
泰迪

46

通过配置路由器并为路由器插座提供名称,您可以在同一模板中具有多个路由器插座,您可以按以下步骤实现。

以下方法的优点是,您可以避免URL看起来很脏。例如:/ home(aux:login)等。

假设负载,您正在引导appComponent。

app.component.html

<div class="layout">
    <div class="page-header">
        //first outlet to load required component
        <router-outlet name='child1'></router-outlet>
    </div>
    <div class="content">
        //second outlet to load required component
        <router-outlet name='child2'></router-outlet>
    </div>
</div>

将以下内容添加到路由器。

{
    path: 'home',  // you can keep it empty if you do not want /home
    component: 'appComponent',
    children: [
        {
            path: '',
            component: childOneComponent,
            outlet: 'child1'
        },
        {
            path: '',
            component: childTwoComponent,
            outlet: 'child2'
        }
    ]
}

现在,当加载/ home时,appComponent将使用分配的模板进行加载,然后有角度的路由器将根据名称检查路由并在指定的路由器出口中加载子组件。

像上面一样,您可以将路由器配置为在同一路由中具有多个路由器出口。


19

新的RC.3路由器更改了辅助路由语法。

辅助路由存在一些已知问题,但可以提供基本支持。

您可以定义路线以显示命名的组件 <router-outlet>

路由配置

{path: 'chat', component: ChatCmp, outlet: 'aux'}

命名路由器插座

<router-outlet name="aux">

导航辅助路线

this._router.navigateByUrl("/crisis-center(aux:chat;open=true)");

似乎尚不支持从routerLink导航辅助路由

<a [routerLink]="'/team/3(aux:/chat;open=true)'">Test</a>

<a [routerLink]="['/team/3', {outlets: {aux: 'chat'}}]">c</a>

还没尝试过

另请参阅Angular2路由器在一个组件中

RC.5 routerLink DSL(与createUrlTree参数相同)https://angular.io/docs/ts/latest/api/router/index/Router-class.html#!#createUrlTree-anchor


这应该在RC5中起作用吗?我没有设法使它工作。查看路由器的源代码,我也找不到任何“ @Input()名称”。
昆根

@Input()名称是RouterOutlet该类的属性。我必须检查routerLink的辅助路由路径语法。
君特Zöchbauer

目前的语法似乎是<a [routerLink]="['/team/3', {outlets: {aux: 'chat'}}]">c</a>
君特Zöchbauer

请查看此问题,看看您是否能帮助我。stackoverflow.com/questions/39142396/…–
昆根

@GünterZöchbauer在查看了您的答案后-我认为我缺少了一些东西-通过routerLink访问AUX路由后,是否可以删除它们?(不是通过代码)。我在这个简单的plnkr中尝试了您的答案,但没有成功。辅助路线不会消失
罗伊·纳米尔

16

<a [routerLink]="[{ outlets: { list:['streams'], details:['parties'] } }]">Link</a>

<div id="list">
    <router-outlet name="list"></router-outlet>
</div>
<div id="details">
    <router-outlet name="details"></router-outlet>
</div>

`

 {
    path: 'admin',
    component: AdminLayoutComponent,
    children:[
      {
        path: '',
        component: AdminStreamsComponent, 
        outlet:'list'
      },
      {
        path: 'stream/:id',
        component: AdminStreamComponent,
        outlet:'details'
      }
    ]
  }

3

是的,您可以按照上面@tomer的说法进行操作。我想为@tomer答案添加一些观点。

  • 首先,您需要在router-outlet视图中提供要加载第二个路由视图的位置的名称。(辅助路由angular2。)
  • 在angular2路由中,这里没有几个要点。

    • path或aux(需要其中之一来提供必须显示为url的路径)。
    • 组件,加载器,redirectTo(恰好需要其中之一,即要在路由上加载的组件)
    • name或as(可选)(仅要求其中之一,即在routerLink时指定的名称)
    • 数据(可选,无论您希望通过接收方使用routerParams进行路由发送的任何内容。)

有关更多信息,请在此处此处阅读

import {RouteConfig, AuxRoute} from 'angular2/router';
@RouteConfig([
  new AuxRoute({path: '/home', component: HomeCmp})
])
class MyApp {}

3
您的两个链接均已断开。
ceebreenk

0

似乎有另一种(颇为怪异的)方式可以在一个模板中重用路由器出口。该答案仅用于提供信息的目的,此处使用的技术可能不应在生产中使用。

https://stackblitz.com/edit/router-outlet-twice-with-events

路由器插座由ng模板包装。通过侦听路由器的事件来更新模板。在每次事件中,都将交换模板并使用空的占位符重新交换模板。没有此“交换”,模板将不会更新。

但是,绝对不建议使用这种方法,因为两个模板的整体交换似乎有点麻烦。

在控制器中:

  ngOnInit() {
    this.router.events.subscribe((routerEvent: Event) => {
      console.log(routerEvent);
      this.myTemplateRef = this.trigger;
      setTimeout(() => {
        this.myTemplateRef = this.template;
      }, 0);
    });
  }

在模板中:

<div class="would-be-visible-on-mobile-only">
  This would be the mobile-layout with a router-outlet (inside a template): 
  <br>
  <ng-container *ngTemplateOutlet="myTemplateRef"></ng-container>
</div>

<hr>

<div class="would-be-visible-on-desktop-only">
  This would be the desktop-layout with a router-outlet (inside a template): 
  <br>
  <ng-container *ngTemplateOutlet="myTemplateRef"></ng-container>
</div>

<ng-template #template>
    <br>
    This is my counter: {{counter}}
    inside the template, the router-outlet should follow
    <router-outlet>
    </router-outlet>
</ng-template>

<ng-template #trigger>
  template to trigger changes...
</ng-template>

0

您不能在具有ngIf条件的同一模板中使用多个路由器出口。但是您可以按以下所示方式使用它:

<div *ngIf="loading">
  <span>loading true</span>
  <ng-container *ngTemplateOutlet="template"></ng-container>
</div>

<div *ngIf="!loading">
  <span>loading false</span>
  <ng-container *ngTemplateOutlet="template"></ng-container>
  </div>

  <ng-template #template>
    <router-outlet> </router-outlet>
  </ng-template>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.