Я активировал trackBy в своем ngFor, и я подтвердил, что он вызывается и работает, но я все еще замечаю, что DOM повторно отображается в моем браузере, из-за чего строки мерцают. Что здесь происходит? В Angular1 я вижу в своем браузере/chrome отладчике, что DOM не обновляется/не заменяется при использовании трека по item.id, и не происходит мерцания, почему это не так в угловом2. Есть ли какая-то ошибка в моем коде или что-то происходит под капотом, что я не знаю, что делает что-то хорошее?ngFor trackBy stil re-rendering DOM?
<tr *ngFor="let item of items| async; trackBy:itemTrackBy">
itemTrackBy(index: number, item: MyItem) {
return item.id;
}
EDIT Я отследил ошибку, чтобы быть в наблюдаемой в моей службе 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);
Вы можете разместить весь свой код, пожалуйста? – Bazinga