私はAngular 7.3.8アプリに取り組んでおり、Angular Materialライブラリを使用しています. NgOnInit サイクルを介してデータを使用してコンポーネントを初期化できますmat-table
が、何らかの関数を介してデータを使用してテーブルを更新しようとすると、UI が更新されません。
すでに NgZone を使用して UI を強制的に更新しようとしましたが、まだ機能していません。
テンプレートのコードは次のとおりです。
<table mat-table [dataSource]="dataSource" class="mat-elevation-z8">
<!-- Checkbox Column -->
<ng-container matColumnDef="select">
<th mat-header-cell *matHeaderCellDef>
<mat-checkbox (change)="$event ? masterToggle() : null"
[checked]="selection.hasValue() && isAllSelected()"
[indeterminate]="selection.hasValue() && !isAllSelected()"
>
</mat-checkbox>
</th>
<td mat-cell *matCellDef="let row">
<mat-checkbox (click)="$event.stopPropagation()"
(change)="$event ? selection.toggle(row) : null"
[checked]="selection.isSelected(row)"
>
</mat-checkbox>
</td>
</ng-container>
<!-- Name Column -->
<ng-container matColumnDef="day">
<th mat-header-cell *matHeaderCellDef> Day </th>
<td mat-cell *matCellDef="let element"> {{element.day | titlecase}} </td>
</ng-container>
<!-- Weight Column -->
<ng-container matColumnDef="startHour">
<th mat-header-cell *matHeaderCellDef> Start Hour </th>
<td mat-cell *matCellDef="let element"> {{element.startHour}} </td>
</ng-container>
<!-- Symbol Column -->
<ng-container matColumnDef="endHour">
<th mat-header-cell *matHeaderCellDef> End Hour </th>
<td mat-cell *matCellDef="let element"> {{element.endHour}} </td>
</ng-container>
<ng-container matColumnDef="action">
<th mat-header-cell *matHeaderCellDef> Action </th>
<td mat-cell *matCellDef="let element"> {{element.action}} </td>
</ng-container>
<tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
<tr mat-row *matRowDef="let row; columns: displayedColumns;"
(click)="selection.toggle(row)">
</tr>
</table>
そして、更新機能は次のとおりです。
ngOnInit(){
this.dataSource = [
{ day: 'Monday' , startHour: '9: 00 am', endHour: '13:00 pm',
action: '' };
}
addPeriod(form: any){
const obj = {
day: form.value.pickedDay,
startHour: form.value.startHour + ': 00 am',
endHour: form.value.endHour + ': 00 pm',
action: ''
} as TableSchedule;
this.zone.run(() => {
this.dataSource.push(obj);
console.log('new data:', this.dataSource);
});
}
ログには dataSource 配列が更新されていることが示されますが、UI には新しい値が表示されません。