You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Mat分页异常:Mat-table仅显示前5条数据且无法更新

问题解决:Mat Pagination不生效+表格数据不更新

你的核心问题出在行索引的使用逻辑和表单组的关联方式上,导致分页切换后表单组匹配错误,看起来数据没更新。以下是具体分析和修复方案:

问题根源

*matCellDef里的rowIndex是当前分页页面的本地索引(比如第二页第一行的rowIndex是0),但你创建表单组时用的是全局数据源的索引(row0到row17)。切换分页后,用本地索引去匹配全局索引的表单组,自然会拿到错误的表单数据,视觉上就表现为表格只显示前5条记录。

虽然你已经设置了dataSource.paginator = this.paginator,但表单关联错误掩盖了分页的实际效果。

修复步骤

1. 给数据源添加唯一标识

初始化数据时,给每个数据项添加唯一的rowId,用来精准关联对应的表单组:

ngOnInit() {
  this.dataSource.data = [
    { rowId: 0, name: 'John', age: 1 },
    { rowId: 1, name: 'Jane', age: 2 },
    { rowId: 2, name: 'Mike', age: 3 },
    { rowId: 3, name: 'John', age: 4 },
    { rowId: 4, name: 'Jane', age: 5 },
    { rowId: 5, name: 'Mike', age: 6 },
    { rowId: 6, name: 'John', age: 7 },
    { rowId: 7, name: 'Jane', age: 8 },
    { rowId: 8, name: 'Mike', age: 9 },
    { rowId: 9, name: 'John', age: 10 },
    { rowId: 10, name: 'Jane', age: 11 },
    { rowId: 11, name: 'Mike', age: 12 },
    { rowId: 12, name: 'John', age: 13 },
    { rowId: 13, name: 'Jane', age: 14 },
    { rowId: 14, name: 'Mike', age: 15 },
    { rowId: 15, name: 'John', age: 16 },
    { rowId: 16, name: 'Jane', age: 17 },
    { rowId: 17, name: 'Mike', age: 18 },
  ];

  // 用rowId作为表单组的唯一key
  this.dataSource.data.forEach((data) => {
    const rowFormGroup = this.formBuilder.group({
      name: [data.name],
      age: [data.age],
    });
    this.tableFormGroup.addControl(`row${data.rowId}`, rowFormGroup);
  });
}

2. 修改表单组获取逻辑

不再依赖本地rowIndex,而是通过当前行的rowId获取对应的表单组:

getFormGroup(row: any): FormGroup {
  return this.tableFormGroup.get(`row${row.rowId}`) as FormGroup;
}

3. 更新HTML模板

把模板里的getFormGroup(rowIndex)改成getFormGroup(row):

<!-- Name列 -->
<td mat-cell *matCellDef="let row; let rowIndex = index">
  <ng-container [formGroup]="getFormGroup(row)">
    <input matInput formControlName="name" [readonly]="true" />
  </ng-container>
</td>

<!-- Age列 -->
<td mat-cell *matCellDef="let row; let rowIndex = index">
  <ng-container [formGroup]="getFormGroup(row)">
    <input matInput formControlName="age" [readonly]="true" />
  </ng-container>
</td>

验证效果

现在切换分页时,每个行都会匹配到自己对应的表单组,表格数据会正确更新,分页功能也会正常生效。

内容的提问来源于stack exchange,提问作者Deepanshu Malviya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 23:45:14