【问题标题】:Nesting ng-bootstrap tabs (Angular 2)嵌套 ng-bootstrap 选项卡(Angular 2)
【发布时间】:2017-05-01 12:10:34
【问题描述】:

我正在尝试嵌套 ng-bootstrap 选项卡小部件,但嵌套选项卡的内容未正确显示。当我单击嵌套选项卡时,内容本身就会消失。

Minimal demo

我做错了什么?

这是查看代码:

            <ngb-tabset>
              <ngb-tab *ngFor="let tab of tabs">
                <ng-template ngbTabTitle>
                  {{ tab.title }}
                </ng-template>
                <ng-template ngbTabContent>
                  {{ tab.content }}

                  <ngb-tabset>
                    <ngb-tab>
                      <ng-template ngbTabTitle>
                        1
                      </ng-template>
                      <ng-template ngbTabContent>
                        1
                      </ng-template>
                    </ngb-tab>
                    <ngb-tab>
                      <ng-template ngbTabTitle>
                        2
                      </ng-template>
                      <ng-template ngbTabContent>
                        2
                      </ng-template>
                    </ngb-tab>
                    <ngb-tab>
                      <ng-template ngbTabTitle>
                        3
                      </ng-template>
                      <ng-template ngbTabContent>
                        3
                      </ng-template>
                    </ngb-tab>
                  </ngb-tabset>

                </ng-template>
              </ngb-tab>
            </ngb-tabset>

【问题讨论】:

  • 预期的视图是什么?可以加个线框吗?
  • 嗯,我觉得已经够清楚了。我想要一个嵌套的标签小部件,这意味着 1 级的每个标签都应该有一个带有自己标签的标签小部件。
  • @alexandernst 这很奇怪,我建议在他们的官方 github repo 中添加错误。我可以看到你已经在那里添加了comment:D
  • @PankajParkar 是对的。我试着这样做。它是 ng-bootstrap 的一个错误。将尝试修复它。帮助Pankaj

标签: javascript angular typescript ng-bootstrap


【解决方案1】:

更新

Angular 4.3.6 包含对此问题的修复。

https://github.com/ng-bootstrap/ng-bootstrap/issues/1433#issuecomment-325104017

以前的版本

这是一个错误。

可能的解决方法可能是使用额外的模板,例如:

<ngb-tabset>
  <ngb-tab *ngFor="let tab of tabs">
    <ng-template ngbTabTitle>
      {{ tab.title }}
    </ng-template>
    <ng-template ngbTabContent>
      {{ tab.content }}
      <ng-container *ngTemplateOutlet="innerTabset"></ng-container>
    </ng-template>
  </ngb-tab>
</ngb-tabset>


<ng-template #innerTabset>
  <ngb-tabset>
    <ngb-tab>
      <ng-template ngbTabTitle>
        1
      </ng-template>
      <ng-template ngbTabContent>
        1
      </ng-template>
    </ngb-tab>
    <ngb-tab>
      <ng-template ngbTabTitle>
        2
      </ng-template>
      <ng-template ngbTabContent>
        2
      </ng-template>
    </ngb-tab>
    <ngb-tab>
      <ng-template ngbTabTitle>
        3
      </ng-template>
      <ng-template ngbTabContent>
        3
      </ng-template>
    </ngb-tab>
  </ngb-tabset>
</ng-template>

Plunker Example

您可以生成任意数量的嵌套标签,例如:

<ng-container *ngTemplateOutlet="innerTabset; context: { $implicit: tabs }"></ng-container>

<ng-template #innerTabset let-tabs>
  <ngb-tabset>
    <ngb-tab *ngFor="let tab of tabs">
      <ng-template ngbTabTitle>
        {{ tab.title }}
      </ng-template>
      <ng-template ngbTabContent>
        {{ tab.content }}
        <ng-template [ngIf]="tab.children">
          <ng-container *ngTemplateOutlet="innerTabset; context: { $implicit: tab.children }"></ng-container>
        </ng-template>
      </ng-template>
    </ngb-tab>
  </ngb-tabset>
</ng-template>

Plunker Example

之所以有效,是因为每个嵌入式模板都有自己的范围,并且角度不会混合查询结果

【讨论】:

    【解决方案2】:

    对于面临同样问题的人。 Angular 4.3.6 包含对此问题的修复。

    更多信息在这里:https://github.com/ng-bootstrap/ng-bootstrap/issues/1433

    【讨论】: