Angular2 несколько маршрутизаторов-розеток в одном шаблоне

Можно ли в одном шаблоне иметь несколько роутеров-розеток?

Если да, то как настроить маршруты?

Я использую бета-версию angular2.


person Islam Shaheen    schedule 06.01.2016    source источник
comment
Что именно вы хотите реализовать? Могут ли подмаршруты соответствовать вашим потребностям? См. Эту ссылку: angular.io/docs/ts/ latest / guide / router.html #! # child-router.   -  person Thierry Templier    schedule 06.01.2016
comment
Мне нужно создать приложение, которое использует несколько сеансов (вкладок), каждый сеанс имеет одно и то же содержимое (например, вкладки браузера).   -  person Islam Shaheen    schedule 06.01.2016
comment
проверьте доклад разработчика маршрутизатора, чтобы узнать, что в настоящее время возможно - ›youtube. com / watch? v = z1NB-HG0ZH4 Если я хорошо помню, есть дочерние маршруты и вспомогательные маршруты.   -  person Angular University    schedule 06.01.2016


Ответы (6)


да, можно, но нужно использовать маршрутизацию aux. вам нужно будет дать название роутеру-розетке:

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

и настройте конфигурацию вашего маршрута:

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

Посмотрите этот пример, а также этот видео.


Обновление для маршрутов RC.5 Aux немного изменилось: в розетке роутера используйте имя:

<router-outlet name="aux">

В конфигурации вашего роутера:

{path: '/auxRouter', component: secondComponentComponent, outlet: 'aux'}
person Tomer Almog    schedule 06.01.2016
comment
кстати, по состоянию на январь 2016 года, согласно этому ресурсу, мы пока не должны использовать aux, так как он не готов github.com/angular/angular/issues/5027#issuecomment-169464546 - person Tomer Almog; 08.01.2016
comment
Спасибо за ответ, я использую бета-версию angular2. я пытался определить вспомогательный маршрут: {aux: '/ edit-entity /: id', name: 'EditEntity', component: EditEntityComponent}, когда я вызываю его, он не работает: this._router.navigate (['/' , ['EditEntity'], {id: id}]); - person Islam Shaheen; 11.01.2016
comment
убедитесь, что вы включаете полный маршрут в раздел навигации, а не относительно вашего компонента. - person Tomer Almog; 12.01.2016
comment
если вы хотите использовать относительный маршрут, используйте ['./routeToYourComponent'], обратите внимание на точку перед косой чертой - person Tomer Almog; 25.04.2016
comment
Обновление: по состоянию на май 2016 года Angular2 только что выпустил свой RC (релиз-кандидат), и теперь маршруты Aux должны работать. - person Tomer Almog; 09.05.2016
comment
@TomerAlmog есть идеи, как они должны работать? На маршрутах конфигов нет участника "aux" (но есть "выход") - person BobbyTables; 22.06.2016
comment
@zedd вам нужно использовать новый пакет маршрутизатора, а не маршрутизатор, устаревший для использования aux - person Tomer Almog; 22.06.2016
comment
1 голос за обновление ответа на RC5. Angular2 меняется так быстро. - person teddy; 31.08.2016

У вас может быть несколько выходов маршрутизатора в одном шаблоне, настроив маршрутизатор и указав имя для своей розетки маршрутизатора, вы можете добиться этого следующим образом.

Преимущество приведенного ниже подхода в том, что с его помощью вы можете избежать грязного вида 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 получит загрузку с выделенным шаблоном, тогда угловой маршрутизатор проверит маршрут и загрузит дочерний компонент в указанную розетку маршрутизатора на основе имени.

Как и выше, вы можете настроить свой маршрутизатор так, чтобы на одном маршруте было несколько маршрутизаторов.

person jigar gala    schedule 13.02.2017
comment
Я попробовал ваш подход, но он не работает. - person Filip Witkowski; 21.12.2020

Синтаксис 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

person Günter Zöchbauer    schedule 29.06.2016
comment
Это должно работать в RC5? Мне не удалось заставить его работать. Глядя на исходный код маршрутизатора, я тоже не могу найти имя @Input (). - person Kungen; 25.08.2016
comment
@Input() name - это свойство класса RouterOutlet. Мне нужно проверить синтаксис пути aux-маршрута для routerLink. - person Günter Zöchbauer; 25.08.2016
comment
Текущий синтаксис выглядит <a [routerLink]="['/team/3', {outlets: {aux: 'chat'}}]">c</a> - person Günter Zöchbauer; 25.08.2016
comment
Пожалуйста, прочтите этот вопрос и посмотрите, сможете ли вы мне помочь. stackoverflow.com/questions/39142396/ - person Kungen; 25.08.2016
comment
Я никогда особо не пробовал дополнительные маршруты, потому что всегда сталкивался с некоторыми ошибками. Я не пробовал уже несколько месяцев, и с тех пор многое было исправлено, но я не знаком с дополнительными маршрутами и боюсь, что не смогу вам помочь. Могут быть и другие вопросы с ответами на эту проблему. - person Günter Zöchbauer; 09.05.2017

Да, вы можете, как сказал @tomer выше. Я хочу добавить точку к ответу @tomer.

  • во-первых, вам нужно указать имя router-outlet, куда вы хотите загрузить второе представление маршрутизации в своем представлении. (вспомогательная маршрутизация angular2.)
  • В маршрутизации angular2 здесь есть несколько важных моментов.

    • path or aux (requires exactly one of these to give the path you have to show as the url).
    • component, loader, redirectTo (требуется ровно один из них, какой компонент вы хотите загрузить при маршрутизации)
    • name или as (необязательно) (требуется ровно одно из них, имя, которое указывается во время routerLink)
    • данные (необязательно, все, что вы хотите отправить с маршрутизацией, которую вы должны получить с помощью routerParams на стороне получателя).

для получения дополнительной информации прочтите здесь и здесь.

import {RouteConfig, AuxRoute} from 'angular2/router';
@RouteConfig([
  new AuxRoute({path: '/home', component: HomeCmp})
])
class MyApp {}
person Pardeep Jain    schedule 07.01.2016
comment
Обе ваши ссылки не работают. - person ceebreenk; 20.06.2017

Кажется, есть еще один (довольно хакерский) способ повторно использовать роутер-розетку в одном шаблоне. Этот ответ предназначен только для информационных целей, и используемые здесь методы, вероятно, не должны использоваться в производстве.

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>
person Tobias Gassmann    schedule 24.06.2020

Вы не можете использовать несколько выходов маршрутизатора в одном шаблоне с условием 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>
person dev0201    schedule 31.08.2020