mat-tab 上的奇怪行为

Strange behavior on mat-tab

我在使用 Angular Material 选项卡时遇到了一个奇怪的问题,希望有人能帮助我解释发生了什么。 https://stackblitz.com/edit/angular-ivy-yttids

我有一个带有 3 个选项卡的 mat-tab 组件。我的目标是在用户第一次单击任何选项卡时立即调用外部服务,并在选项卡内容中显示结果。

在页面初始化时,会生成选项卡,并且 Tab-1 已被选中。 如果我按特定顺序单击选项卡 (Tab3->Tab2-Tab1),一切都如预期的那样。 但是,如果我先单击 Tab2,在页面刷新后,它不会被激活,但焦点会无缘无故地自动传递到 Tab-3 上。该行为仅在 Tab1 上重复一次并恢复正常,这意味着我可以激活我单击的选项卡。

这是您可能想检查一下的另一种奇怪的点击顺序:

  1. Tab2(传递给 Tab3)
  2. Tab2(显示内容)
  3. Tab1(传递到 Tab3)
  4. Tab1(显示内容)
  5. Tab3(显示内容)
  6. Tab1(显示内容)
  7. Tab2(无选项卡内容,虽然内部变量很好并且正在执行第 2 步)

如果你能看看 link 并告诉我你是否能弄清楚到底发生了什么,我将不胜感激。

谢谢

好吧,您实际上是在更改用于呈现选项卡的 section 变量。 (在你的 *ngFor 里面)。

更改此部分将强制 mat-tab 重新加载组件,这会导致一个有趣的错误 (抱歉,无法解释得更好)

我的选择是添加一个 trackBy 函数,所以你告诉 angular 只重新加载确实发生变化的元素。

解决方案在 stackblirtz

  1. 将 trackBy 函数添加到您的 .component.ts
 trackByIndexFn(index: any, item: any) {
    return index
  }
  1. 然后进入你的.component.html
<div *ngIf="input">
  <mat-tab-group
    #tabs
    mat-align-tabs="center"
    animationDuration="0ms"
    [(selectedIndex)]="selectedIndexBinding"
    (selectedIndexChange)="onTabChanged($event)"
  >
    <mat-tab
      *ngFor="let section of parts; index as tabNo; trackBy: trackByIndexFn" <!-- Here, I use the trackBy function -->
    >
      <ng-template mat-tab-label>
        <span class="tab-heading">Tab {{ tabNo + 1 }}</span>
      </ng-template>
      <ng-template matTabContent>
        <br />
        <div *ngFor="let data of section; index as i">
          <div style="text-align:center">{{ data }}</div>
          <br />
        </div>
      </ng-template>
    </mat-tab>
  </mat-tab-group>
</div>

您不仅避免了错误,还优化了您的代码 ;)