#angular #dom #ngfor
#angular #dom #ngfor
Вопрос:
Я использую Angular 10 и *ngFor
директиву для создания списка элементов. Всякий раз, когда изменяется входной массив, я что-то делаю с элементом. Например:
ngAfterViewInit() {
this.elements.changes.subscribe(t => {
this.loadElementInfos();
})
}
Если я устанавливаю break-point
внутри функции, иногда я вижу, что *ngFor
на самом деле добавляет новые элементы в список, а затем отбрасывает старые элементы.
например:
old-element-0
old-element-1
old-element-2
old-element-3
new-element-0
new-element-1
new-element-2
new-element-3
И миллисекундой позже старые элементы отбрасываются. Есть ли какой-либо шанс контролировать это поведение ngFor
, чтобы не делать этого?
new-element-0
new-element-1
new-element-2
new-element-3
Комментарии:
1. действительно зависит от того, что вы делаете в этой функции и как выглядят объекты, но обычно вы можете управлять этим с помощью
trackBy
предложения
Ответ №1:
Если нам нужно в какой-то момент изменить данные в коллекции, Angular необходимо удалить все
DOM
элементы, связанные с данными, и создать их снова. Это означает многоDOM
манипуляций, особенно в случае большой коллекции, и, как мы знаем,DOM
манипуляции стоят дорого.
Вы можете помочь Angular отслеживать, какие элементы добавлены или удалены, предоставив trackBy
функцию, подобную этой:
app.component.ts
import {Component, NgModule} from '@angular/core'
import {BrowserModule} from '@angular/platform-browser'
@Component({
selector: 'my-app',
template: `./my-app.html`,
})
export class App {
collection = any[];
constructor() {
this.collection = [{id: 1}, {id: 2}, {id: 3}];
}
trackByFn(index, item) {
return index;
}
}
app.component.html
<ul>
<li *ngFor="let item of collection;trackBy: trackByFn">{{item.id}}</li>
</ul>
Для большего понимания смотрите эту полезную статью: Повышение производительности с помощью trackBy