*ngFor
использует сравнение равно ===
, чтобы увидеть, изменился ли экземпляр Array
.Если новый массив и старый массив не являются одной и той же ссылкой, то все элементы в коллекции воссоздаются.
Чтобы сообщить *ngFor
, что он не должен воссоздавать элемент, но повторно использовать элемент вмассив.Вы должны использовать функцию обратного вызова trackBy
.
<li *ngFor="let item in list | async; trackBy: trackItem"></li>
Затем в вашем компоненте
public trackItem(indx: number, item: LinkItem): number {
return item.id;
}
Эта функция должна возвращать значение (число, строку, объект и т. Д.), Котороедает true
для равных ===
сравнений.Вот как ngFor
знает, что он должен повторно использовать компонент с этим элементом массива.
В моем примере выше я предположил, что это уникальный номер id
, который можно использовать из каждого LinkItem
.
Все это останавливает рекурсивные вызовы ngOnChanges
, поскольку эти компоненты воссоздаются каждый раз, когда list
обновляется новым экземпляром массива.