網站搜尋

javascript - 當新增標籤頁時,Angular 元素在 mat-tab-group 上被銷毀


我有一個 mat-tab-group,它是從一個陣列填充的。我會動態地向這個陣列添加新項目,而標籤的內容是 Angular 元件。

當我添加一個新元素時,一切運作正常,我也能看到新增的元素,但當我再添加一個新元素時,之前的元素會被銷毀,標籤頁內容會顯示為空。

我已經檢查了一個元素在被添加時的情況,我看到它運作得很完美,但當我添加一個新元素時,我可以看到之前的元素從 DOM 中消失了。

我已經嘗試將普通文字添加到標籤中,而不是 Angular Elements 元件,一切都如預期般運作,而且我可以在標籤之間前後切換。

這個標籤群組的 HTML 如下:

<mat-tab-group [selectedIndex]="selectedTab">
  <mat-tab *ngFor="let tab of tabs; let i = index" [label]="tab.name">
    <div [innerHTML]="tab.content"></div>
  </mat-tab>
</mat-tab-group>

新增分頁的程式碼如下:

this.tabs.push({
  name: this.options[opt].name,
  content: this.domSanitizer.bypassSecurityTrustHtml('<osm-'+this.options[opt].content+'></osm-'+this.options[opt].content+'>')
} as MainTab);
this.selectedTab = this.tabs.length -1;

options 陣列是一個可以新增的可能新分頁清單:

options = [
  {id: 1, name: 'Sell', content: 'sell'},
  {id: 2, name: 'Admin', content: 'admin'}
];

而 osm-sell 和 osm-admin 組件已經被創建為 Angular Elements 組件(如本指南中所述)。

所有代碼都在 Github 上。

預期結果應該是第一步發生的情況,新分頁會被新增,內容中包含該元件,但在新增新分頁時,它會被銷毀。

實時測試在 https://tpv.osumi.es

謝謝!!

答案#1

因為推入陣列會觸發變更檢測,而你的分頁沒有被正確追蹤,所以框架會重新渲染它們。

嘗試使用自訂曲目功能:

*ngFor="let tab of tabs; let i = index; trackBy: customTB"

在你的 TS 中

customTB(index, tab) {
  return tab.id;
}