【问题标题】:ngFor trackBy stil re-rendering DOM?ngFor trackBy 仍然重新渲染 DOM?
【发布时间】:2017-03-04 22:12:23
【问题描述】:

我在我的 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);

【问题讨论】:

  • 您可以发布您的整个代码吗?

标签: angular ngfor angularjs-track-by


【解决方案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 中看到 -> 检查元素仅添加的项目闪烁。

Working plunker

【讨论】:

  • 我确认了这项工作。如果我只是使用 Observable.of([...]) 将静态数据添加到我的列表中,而不是来自我的 API 服务,我可以确认它正在工作。我正在更新我的问题。
猜你喜欢
  • 1970-01-01
  • 2018-11-18
  • 1970-01-01
  • 2021-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-09
相关资源
最近更新 更多