Загрузка…
Загрузка…
trackBy (и обязательный track в @for) сообщает Angular стабильный идентификатор элемента списка, чтобы при обновлении массива не пересоздавать DOM зря.
<li *ngFor="let u of users; trackBy: trackUser">{{ u.name }}</li>trackUser = (_index: number, u: User) => u.id;@for (u of users(); track u.id) {
<li>{{ u.name }}</li>
}Без стабильного ключа иммутабельное обновление (users = users.map(...)) часто приводит к уничтожению и созданию узлов: потеря фокуса в инпутах, сброс состояния детей, лишняя работа. Track по индексу ломается при вставке/удалении в середине — предпочитайте бизнес-id.
Вместе с OnPush и неизменяемыми данными track — базовый приём для «живых» таблиц. Для тысяч строк дополнительно смотрят virtual scroll, но без track виртуализация тоже страдает.
Попросите объяснить, почему track по индексу опасен при сортировке. Ожидают связь с потерей фокуса и лишним GC DOM-узлов на больших списках.
Стабильный track сохраняет DOM и UI-состояние строк. В @for выражение track обязательно — это часть современного синтаксиса Angular. В командах со Signals часто пишут @for (u of users(); track u.id) — тот же принцип идентичности, что и классический trackBy.
