簡體   English   中英

在Angular 4中使用trackBy對* ngFor數組進行排序

[英]sorting an *ngFor array with trackBy in Angular 4

我在排序和具有trackBy功能的數組時遇到問題。 用例如下:

我有一個項目數組。 所有這些項都具有z-index屬性。 我還有一個圖層管理器​​,可以編輯每個項目的z-index。 當我想保存我的項目時,我想根據每個項目的z-index屬性對我的數組進行排序。 我還有一個跟蹤我的ngFor來限制* ngFor的變化檢測量。

使用我的* ngFor上的trackBy函數,當我對數組進行排序時(不好),項目切換位置。 如果我刪除了trackBy函數,則不會發生這種情況,並且根據z-index對項目進行排序。

* ngFor:

<div class="item" *ngFor="let item of items; let i = index;trackBy:getUniqueIdentifier">

trackBy功能:

getUniqueIdentifier(index, item) {
    return this.items.length + ', ' + this.languages._previewLanguage;
}

如您所見,當項目的長度發生變化或我切換語言設置時,* ngFor會發生變化。 我已經嘗試添加+ ', ' + item.zIndex但這不起作用。

排序功能:

sortItemsArrayByZIndex() {
    this.items.sort((i1, i2) => {
        return (i1.zIndex - i2.zIndex);
    });
}

所以似乎trackBy和這種排序函數由於某種原因而發生沖突。 現在的結果是,當我使用sort函數時,items數組根據z-index進行排序,但項目也會切換位置,這意味着它們的維度屬性由於某種原因而被切換。

我想要的是items數組根據z-index排序,但項目保持其尺寸。

我如何更改我的trackBy函數或我的排序函數,以便我得到我想要的結果?

如果您不介意,我會添加自己的答案來解釋您的代碼無效的原因,因為您只提供了一個沒有解釋的工作代碼。

trackBy功能

trackBy功能用於改善性能,並避免不必要的變化檢測。 您可以像提供的那樣提供自定義功能,它將創建一個值,以便檢查是否需要觸發更改檢測。

問題

你的trackBy函數是這樣的:

getUniqueIdentifier(index, item) {
  return this.items.length + ', ' + this.languages._previewLanguage;
}

這將返回此類型的值:

90, en-US

除非您從陣列中推送/撤銷項目 ,並且en-US 可以應用於陣列的多個項目, 否則 90將不會更改。 這意味着如果更改索引或其他字段,則不會發生更改檢測。

解決方案

由於您要對數組進行排序,因此必須至少將索引添加到自定義函數的返回值中。 這意味着如果項目的索引發生更改(並且由於您對數組進行排序,它將會發生),將發生更改檢測。

最小代碼是:

getUniqueIdentifier(index, item) {
  return index + ', ' + this.languages._previewLanguage + ', ' + this.items.length;
}

用戶@trichetriche提到我需要將索引和zIndex屬性添加到trackBy以讓TrackBy按預期工作。

trackBy函數看起來像這樣:

getUniqueIdentifier(index, item) {
    return index + ', ' + item.zIndex + ', ' + this.languages._previewLanguage + ', ' + this.items.length;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM