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 -> элемент проверки только мерцание добавленного элемента.

Рабочий плункер

Другие вопросы по тегам