Angular2 багаторазовий маршрутизатор-розетка в одному шаблоні


83

Чи можна мати один і той же шаблон маршрутизатора?

Якщо так, то як налаштувати маршрути?

Я використовую angular2 beta.


Що саме ви хочете реалізувати? Чи можуть під маршрути відповідати вашим потребам? Дивіться це посилання: angular.io/docs/ts/latest/guide/router.html#!#child-router .
Тьєррі Темплієр

мені потрібно створити програму, яка використовує кілька сеансів (вкладок), кожна сесія має однаковий вміст (як вкладки браузера).
Іслам Шахін

перевірте розмову розробника маршрутизатора, щоб побачити, що на даний момент можливо -> youtube.com/watch?v=z1NB-HG0ZH4, ЯК Я добре пам’ятаю, що існують дочірні та допоміжні маршрути.
Angular University

Відповіді:


57

так ви можете, але вам потрібно використовувати допоміжну маршрутизацію. Вам потрібно буде вказати ім’я вашої розетки:

<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 Aux маршрутів трохи змінилося: у розетці маршрутизатора використовуйте ім'я:

<router-outlet name="aux">

У конфігурації маршрутизатора:

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

1
до речі, станом на січень 2016 року, згідно з цим ресурсом, ми ще не повинні використовувати aux, оскільки він ще не готовий github.com/angular/angular/issues/5027#issuecomment-169464546
Томер

дякую за відповідь, я використовую angular2 beta. я намагався визначити допоміжний маршрут: {aux: '/ edit-entity /: id', name: 'EditEntity', компонент: EditEntityComponent}, коли я викликаю це не працює: this._router.navigate (['/' , ['EditEntity'], {id: id}]);
Іслам Шахін,

переконайтеся, що ви включили повний маршрут до розділу навігації, а не щодо вашого компонента.
Томер Альмог,

4
Оновлення: станом на травень 2016 року Angular2 щойно випустив свій RC (кандидат на випуск), і тепер маршрути Aux повинні працювати.
Томер Альмог,

3
1 голос за оновлену відповідь до RC5. Зміна Angular2 так швидко.
Тедді

47

Ви можете мати декілька розеток-маршрутизаторів в одному шаблоні, налаштувавши свій маршрутизатор і вказавши ім’я розетки-маршрутизатора, ви можете досягти цього наступним чином.

Перевага нижченаведеного підходу полягає в тому, що ви можете уникнути брудної 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

Синтаксис Aux-маршрутів змінився з новим маршрутизатором 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 () name".
Кунген,

@Input()name є властивістю RouterOutletкласу. Мені потрібно перевірити синтаксис шляху додаткового маршруту для routerLink.
Günter Zöchbauer

Нинішнім синтаксисом є<a [routerLink]="['/team/3', {outlets: {aux: 'chat'}}]">c</a>
Гюнтер Цохбауер,

Будь ласка, подивіться на це питання і переконайтеся, що вам вдається мені допомогти. stackoverflow.com/questions/39142396 / ...
Kungen

@ GünterZöchbauer Переглянувши вашу відповідь - я думаю, мені чогось не вистачає - чи можна видалити AUX-маршрути після відвідування їх через routerLink? (не через код). Я спробував вашу відповідь у цьому простому 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куди ви хочете завантажити другий вигляд маршрутизації у своєму поданні. (допоміжна маршрутизація кутова2.)
  • У маршрутизації angular2 тут є кілька важливих моментів.

    • path або aux (потрібен саме один із них, щоб вказати шлях, який потрібно показати як URL-адресу).
    • component, loader, redirectTo (потрібен саме один із них, який компонент ви хочете завантажити при маршрутизації)
    • name або як (необов’язково) (потрібне саме одне з них, ім’я, яке вказується під час 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>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.