Direct answer
No. MatTable has no public API that watches for in-place array mutations such as push(), splice(), or direct index assignment. If the array reference stays the same, the table keeps rendering the previous rows. Under ChangeDetectionStrategy.OnPush, Angular also skips checking the component unless a bound input reference changes or you explicitly mark the view for check.
Likely explanation versus confirmed behavior
Likely explanation: MatTableDataSource uses an internal differ that runs when its data setter is called. Mutating the array in place bypasses that setter, so the differ never sees a new collection and the table does not re-render rows.
Confirmed behavior: reassigning dataSource.data to a new array, or calling renderRows() after mutation, forces the table to redraw. With OnPush, pair that with ChangeDetectorRef.markForCheck() or detectChanges() so Angular runs the component's change detection cycle.
Unsupported: private methods on MatTableDataSource may appear to refresh the table, but they are not public API and can break between Angular Material releases. Do not use them in production.
Assumptions
This answer assumes Angular Material's MatTableDataSource is the data source and the component uses ChangeDetectionStrategy.OnPush. Behavior may differ with a custom data source or with the default change-detection strategy.
Steps for this case
- Replace in-place mutation with an immutable update:
this.dataSource.data = [...this.dataSource.data, newRow];
- If the component uses OnPush, trigger change detection after the assignment:
constructor(private cdr: ChangeDetectorRef) {}
// ...
this.dataSource.data = [...this.dataSource.data, newRow];
this.cdr.markForCheck();
- Add trackBy to the table definition so Angular Material reuses existing row DOM nodes when only the reference changes:
<table mat-table [dataSource]='dataSource' [trackBy]='trackByFn'>
...
</table>
trackByFn = (_index: number, item: any) => item.id;
Missing diagnostic detail
Is your dataSource a MatTableDataSource instance, or a custom object or array? If it is not MatTableDataSource, renderRows() may be the only supported refresh lever, and the reference-reassignment step above does not apply.
Verification
Open browser DevTools, inspect the table body, and count tr elements before and after mutation. The count should match the array length only after reassignment or renderRows() plus change-detection marking.