ng Для трека по-прежнему ре-рендеринг DOM?
Я активировал trackBy в моем ngFor и подтвердил, что он вызывается и работает, но я все еще замечаю, что DOM перерисовывается в моем браузере, что вызывает мерцание строк. Что здесь происходит? В Angular1 я вижу в своем браузере / отладчике Chrome, что DOM не обновляется / не заменяется при использовании track by item.id и не возникает мерцания, почему это не так в angular2. Есть ли какая-то ошибка в моем коде или что-то происходит под капотом, что я не осознаю, что делаю что-то хорошее?
<tr *ngFor="let item of items| async; trackBy:itemTrackBy">
itemTrackBy(index: number, item: MyItem) {
return item.id;
}
РЕДАКТИРОВАТЬ Я отследил ошибку, чтобы быть в наблюдаемом в моей службе API, вызывающую это, но все еще не знаю почему.
this.items= this.apiService.getItems(searchText).share();
getItems(search?: string): Observable<Item[]> {
let searchParams = new URLSearchParams();
if (search) {
searchParams.set('searchText', search);
}
return this.http
.get(API_BASE_URL + '/items', {search: searchParams})
.map(response => response.json())
.catch(this.handleError);
}
Решение
Решено с помощью того же наблюдаемого this.items вместо того, чтобы заменять его новым каждый раз, когда я перезагружаю новые данные.
this.items = Observable.concat(Observable.of(''), this.searchInput.valueChanges)
.debounceTime(200)
.map((value:string) => value.trim())
.distinctUntilChanged()
.switchMap(search => this.apiService.getItems(searchText);
1 ответ
Я не уверен, как вы реализуете функцию изменения, но я реализовал этот код, и он отлично работает:
export class AppComponent {
episodes = Observable.of([
{ title: 'Winter Is Coming', id: 0 }
]);
add() {
this.episodes = Observable.of([
{ title: 'Winter Is Coming', id: 0 },
{ title: 'The Kingsroad', id: 1 }
])
}
itemTrackBy(index: number, item) {
return item.id;
}
}
<button (click)="add()">Add</button>
<ul>
<li *ngFor="let episode of episodes | async; trackBy: itemTrackBy">
{{episode.title}}
</li>
</ul>
При нажатии на кнопку добавления вы увидите в devtools -> элемент проверки только мерцание добавленного элемента.