我在我的 ngFor 中激活了 trackBy 并确认它已被调用并且正在工作,但我仍然注意到 DOM 在我的浏览器中重新呈现,这导致行闪烁。这里发生了什么?在 Angular1 中,我可以在我的浏览器/chrome 调试器中看到,当使用 item.id 跟踪并且没有发生闪烁时,DOM 没有更新/替换,为什么在 angular2 中不是这种情况。我的代码中是否存在一些错误,或者是否发生了一些我不知道实际上做了好事的事情?
<tr *ngFor="let item of items| async; trackBy:itemTrackBy">
itemTrackBy(index: number, item: MyItem) {
return item.id;
}
编辑 我跟踪错误在我的 API 服务中的 observable 中导致了这个,但仍然不知道为什么。
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);