Angular2 nhiều bộ định tuyến-ổ cắm trong cùng một mẫu


81

Có thể có nhiều bộ định tuyến-ổ cắm trong cùng một mẫu không?

Nếu có thì làm thế nào để cấu hình các tuyến đường?

Tôi đang sử dụng phiên bản beta angle2.


Bạn chính xác muốn thực hiện điều gì? Các tuyến đường phụ có thể phù hợp với nhu cầu của bạn? Xem liên kết này: angle.io/docs/ts/latest/guide/router.html#!#child-router .
Thierry Templier

tôi cần tạo một ứng dụng sử dụng nhiều phiên (tab) mỗi phiên có cùng nội dung (như các tab của trình duyệt).
Islam Shaheen

kiểm tra cuộc nói chuyện từ nhà phát triển bộ định tuyến, để xem những gì hiện có thể -> youtube.com/watch?v=z1NB-HG0ZH4 NẾU tôi nhớ rõ có các tuyến con và tuyến phụ.
Đại học Angular

Câu trả lời:


55

có, bạn có thể, nhưng bạn cần sử dụng định tuyến aux. bạn sẽ cần đặt tên cho cửa hàng bộ định tuyến của mình:

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

và thiết lập cấu hình tuyến đường của bạn:

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

xem ví dụ này: http://plnkr.co/edit/JsZbuR?p=preview Cũng là video này: https://www.youtube.com/watch?v=z1NB-HG0ZH4&feature=youtu.be


Cập nhật cho các tuyến RC.5 Aux đã thay đổi một chút: trong ổ cắm bộ định tuyến của bạn, hãy sử dụng tên:

<router-outlet name="aux">

Trong cấu hình bộ định tuyến của bạn:

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

1
bằng cách này, tính đến tháng 1 năm 2016, theo nguồn này, chúng ta không nên sử dụng aux chỉ được nêu ra, vì nó không phải là sẵn sàng github.com/angular/angular/issues/5027#issuecomment-169464546
Tomer Almog

cảm ơn vì đã trả lời, tôi đang sử dụng phiên bản beta của angle2. tôi đã cố gắng xác định lộ trình aux: {aux: '/ edit-entity /: id', name: 'EditEntity', component: EditEntityComponent} khi tôi gọi nó không hoạt động: this._router.navigate (['/' , ['EditEntity'], {id: id}]);
Islam Shaheen

đảm bảo rằng bạn đang bao gồm toàn bộ tuyến đường trong phần điều hướng, không liên quan đến thành phần của bạn.
Tomer Almog,

4
Cập nhật: kể từ tháng 5 năm 2016, Angular2 mới phát hành RC (ứng cử viên phát hành) của họ và bây giờ các tuyến Aux được cho là hoạt động.
Tomer Almog

3
1 phiếu bầu cho câu trả lời cập nhật cho RC5. Angular2 thay đổi quá nhanh.
teddy

46

Bạn có thể có nhiều cổng ra bộ định tuyến trong cùng một mẫu bằng cách định cấu hình bộ định tuyến và cung cấp tên cho bộ định tuyến của bạn, bạn có thể đạt được điều này như sau.

Lợi thế của cách tiếp cận dưới đây là bạn có thể tránh URL trông bẩn với nó. ví dụ: / home (aux: đăng nhập), v.v.

Giả sử khi tải, bạn đang khởi động 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>

Thêm sau vào bộ định tuyến của bạn.

{
    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'
        }
    ]
}

Bây giờ khi / home được tải appComponent sẽ được tải với mẫu được phân bổ, sau đó bộ định tuyến góc cạnh sẽ kiểm tra tuyến đường và tải thành phần con trong cửa hàng bộ định tuyến được chỉ định trên cơ sở tên.

Giống như ở trên, bạn có thể cấu hình bộ định tuyến của mình để có nhiều bộ định tuyến-ổ cắm trên cùng một tuyến đường.


19

Cú pháp của các tuyến Aux đã thay đổi với bộ định tuyến RC.3 mới.

Có một số vấn đề đã biết với các tuyến aux nhưng vẫn có hỗ trợ cơ bản.

Bạn có thể xác định các tuyến đường để hiển thị các thành phần trong một <router-outlet>

Định cấu hình

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

Ổ cắm bộ định tuyến được đặt tên

<router-outlet name="aux">

Điều hướng các tuyến đường aux

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

Có vẻ như điều hướng các tuyến aux từ bộ định tuyếnLink chưa được hỗ trợ

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

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

Chưa cố gắng bản thân mình

Xem thêm bộ định tuyến Angular2 trong một thành phần

Bộ định tuyến RC.5 Liên kết DSL (giống như createUrlTreetham số) https://angular.io/docs/ts/latest/api/router/index/Router-class.html#!#createUrlTree-anchor


Điều này có phải hoạt động trong RC5 không? Tôi đã không quản lý để làm cho nó hoạt động. Nhìn vào mã nguồn của bộ định tuyến, tôi cũng không tìm thấy "tên @Input ()" nào.
Kungen

@Input()tên là một thuộc tính của RouterOutletlớp. Tôi phải kiểm tra cú pháp đường dẫn tuyến aux cho routerLink.
Günter Zöchbauer

Cú pháp hiện nay có vẻ là<a [routerLink]="['/team/3', {outlets: {aux: 'chat'}}]">c</a>
Günter Zöchbauer

Hãy xem câu hỏi này và xem nếu bạn quản lý để giúp tôi. stackoverflow.com/questions/39142396/…
Kungen

@ GünterZöchbauer Sau khi xem câu trả lời của bạn - tôi nghĩ rằng tôi đang thiếu điều gì đó - có thể xóa các tuyến AUX sau khi truy cập chúng qua routerLink không? (không qua mã). Tôi đã thử câu trả lời của bạn trong plnkr đơn giản này mà không thành công. Tuyến đường aux sẽ không hoạt động trở lại
Royi Namir

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

Có, bạn có thể như đã nói bởi @tomer ở ​​trên. tôi muốn thêm một số điểm vào câu trả lời @tomer.

  • trước hết bạn cần cung cấp tên cho router-outletnơi bạn muốn tải chế độ xem định tuyến thứ hai trong chế độ xem của bạn. (định tuyến aux góc2.)
  • Trong định tuyến angle2 có một số điểm quan trọng ở đây.

    • path hoặc aux (yêu cầu chính xác một trong số này để cung cấp đường dẫn bạn phải hiển thị dưới dạng url).
    • component, loader, redirectTo (yêu cầu chính xác một trong số này, thành phần nào bạn muốn tải khi định tuyến)
    • name hoặc as (tùy chọn) (yêu cầu chính xác một trong số này, tên chỉ định tại thời điểm routerLink)
    • dữ liệu (tùy chọn, bất kỳ thứ gì bạn muốn gửi với định tuyến mà bạn phải nhận bằng routerParams ở đầu thu.)

để biết thêm thông tin đọc ở đâyở đây.

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

3
Cả hai liên kết của bạn đều bị hỏng.
ceebreenk

0

Có vẻ như có một cách khác (khá khó) để sử dụng lại bộ định tuyến trong một mẫu. Câu trả lời này chỉ dành cho mục đích thông tin và các kỹ thuật được sử dụng ở đây có thể không được sử dụng trong sản xuất.

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

Ổ cắm bộ định tuyến được bao bọc bởi một mẫu ng. Mẫu được cập nhật bằng cách lắng nghe các sự kiện của bộ định tuyến. Trong mọi sự kiện, mẫu được hoán đổi và hoán đổi lại bằng một trình giữ chỗ trống. Nếu không có "hoán đổi" này, mẫu sẽ không được cập nhật.

Tuy nhiên, rõ ràng nhất này không phải là cách tiếp cận được khuyến nghị, vì việc hoán đổi toàn bộ hai mẫu có vẻ hơi khó.

trong bộ điều khiển:

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

trong mẫu:

<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

Bạn không thể sử dụng nhiều cửa hàng bộ định tuyến trong cùng một mẫu với ngIfđiều kiện. Nhưng bạn có thể sử dụng nó theo cách dưới đây:

<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>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.