Как использовать ChangeDetection в Angular 7 (представление не обновляется)?

Я не знаю, как использовать обнаружение изменений в моем угловом приложении. Целью моего подхода является отображение списка обновлений только в том случае, если данные изменяются в моем списке таблиц.

В настоящее время отображаются только первые данные, когда я изменяю одну строку в списке таблиц. В консоли я вижу вторые измененные данные, но мой вид не меняет список обновлений.

Это мой компонент:

import { Component, OnInit, ViewChild, ElementRef, ChangeDetectorRef } from '@angular/core';
...

export class TableListComponent implements OnInit {

  private changedData: ItemList[] = [];
  private existChangedData: boolean = false;

    constructor(private cd: ChangeDetectorRef) { }

  onBlur(item: ItemList): void {
    this.changedData.push(item);
    this.existChangedData = true;

    setTimeout(() => { this.refresh(); });
  }

  refresh() {
    this.cd.detectChanges();
  }
}

и мой взгляд:

//requestData is data from HTTP request to a server

<table mat-table [dataSource] = "requestData" class = "mat-elevation-z5">
  <ng-container matColumnDef = "ID">
    <th mat-header-cell *matHeaderCellDef> ID </th>
    <td mat-cell *matCellDef = "let elem">
      <span> {{elem.ID}} </span>
    </td>
  </ng-container>

  <ng-container matColumnDef = "NAME">
    <th mat-header-cell *matHeaderCellDef> NAME </th>
    <td mat-cell *matCellDef = "let elem">
            <mat-form-field> 
              <input matInput [(ngModel)] = "elem.NAME" #idInput (blur) = "onBlur(idInput, elem)">
            </mat-form-field>
    </td>
  </ng-container>

  <tr mat-header-row *matHeaderRowDef = "displayedCols"></tr>
  <tr mat-row *matRowDef = "let row; columns: displayedCols; let i = index"></tr>
</table>

<br>
<br>

<table mat-table [dataSource] = "changedData" class = "mat-elevation-z5" *ngIf = "existChangedData">
  <ng-container matColumnDef = "ID">
    <th mat-header-cell *matHeaderCellDef> ID </th>
    <td mat-cell *matCellDef = "let cdata"> 
      <span>{{cdata.ID}}</span> 
    </td>
  </ng-container>

  <ng-container matColumnDef = "NAME">
    <th mat-header-cell *matHeaderCellDef> NAME </th>
    <td mat-cell *matCellDef = "let cdata"> 
      <span>{{cdata.NAME}}</span> 
    </td>
  </ng-container>

  <tr mat-header-row *matHeaderRowDef = "displayedCols"></tr>
  <tr mat-row *matRowDef = "let changedRow; columns: displayedCols"></tr>
</table>

Может ли кто-нибудь помочь мне с проблемой?

Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
1
0
516
1

Ответы 1

Angular обнаруживает изменения в вашем массиве только в том случае, если его ссылка изменилась. Поэтому вы должны не только добавлять в него новые записи, но и назначать элементу новый массив. Это можно сделать следующим образом:

this.changedData = this.changeData.slice(0)

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