Как отображать содержимое дочернего компонента в Angular?

У меня есть 3 компонента: вкладки, вкладка и панель инструментов, и я использую их следующим образом: Онлайн-пример :

<tabs>
  <tab title="tab 1" active="true">
    <toolbar>Toolbar 1</toolbar>
    Content 1
  </tab>
  <tab title="tab 2">
     <toolbar>Toolbar 2</toolbar>
     Content 2
  </tab>
</tabs>

Таким образом, у вкладок много вкладок, а у вкладок только одна панель инструментов.

Шаблон вкладок выглядит следующим образом:

<div class="head">
  <ul class="tabs">
    <li *ngFor="let tab of tabs" (click)="select(tab)" class="tab" [class.active]="tab.active">
      <a>{{ tab.title }}</a>
    </li>
  </ul>

  <div class="toolbar">Toolbar of Active Tab</div>

</div>
<ng-content></ng-content>

Как отображать панель инструментов текущей активной вкладки в:

<div class="toolbar">Toolbar of Active Tab</div>

Код каждого компонента:

export class TabsComponent implements AfterContentInit {    
  @ContentChildren(TabComponent) tabs: QueryList<TabComponent>;    
  select(tab: TabComponent) {
    this.tabs.toArray().forEach(tab => { 
      tab.active = false; 
    });
    tab.active = true;
  }
  ngAfterContentInit() {
    let actives = this.tabs.filter((tab) => tab.active);
    if(actives.length === 0) 
      this.select(this.tabs.first);
  }
}

export class TabComponent {
  @Input() active: boolean;
  @Input() title: string;
  @ContentChildren(ToolbarComponent) toolbar: ToolbarComponent;
}

export class ToolbarComponent { }

person Miguel Moura    schedule 20.12.2018    source источник
comment
Как насчет этого? material.angular.io/components/tabs/overview   -  person Unknown User    schedule 20.12.2018
comment
Я бы предпочел решить проблему, которую я написал.   -  person Miguel Moura    schedule 20.12.2018
comment
Не уверен, что понял вопрос... Похоже, панель инструментов отображается только на вкладке 1.   -  person MCMatan    schedule 21.12.2018
comment
@MCMatan Я только что обновил свой вопрос. Обе вкладки имеют панель инструментов.   -  person Miguel Moura    schedule 21.12.2018
comment
*ngIf может помочь   -  person Antoniossss    schedule 21.12.2018
comment
@Antoniossss Конечно, но как отображать содержимое панели инструментов после UL со списком вкладок. Может быть, я что-то упускаю, но я не уверен, как это сделать.   -  person Miguel Moura    schedule 21.12.2018
comment
Я не понимаю причину отрицательного ответа на этот вопрос ... Может ли кто-нибудь объяснить мне?   -  person Miguel Moura    schedule 21.12.2018


Ответы (1)


Как я вижу, вашим лучшим вариантом 2 будет:

Вариант 1. Отделите панель инструментов от компонента вкладки и задайте ее свойства тем же способом, что и для вкладки:

<div class="head">
  <ul class="tabs">
    <li *ngFor="let tab of tabs" (click)="select(tab)" class="tab" [class.active]="tab.active">
      <a>{{ tab.title }}</a>
      <div class="toolbar">Toolbar of Active Tab {{tab.toolbarTitle}}</div>
    </li>
  </ul>
</div>

Вариант 2. Передайте реквизиты панели инструментов в AppState, чтобы панель инструментов могла получить к ним доступ из любого места. https://ngrx.io/

person MCMatan    schedule 22.12.2018