Material-table组件踩坑总结

183 阅读1分钟

mat-table组件如何避免初始化时没数据导致报错的问题?

  • 背景

    我们使用mat-table时,传入dataSource是必备的,

<table
        mat-table
        matSort
        [dataSource]="dataSource"
        class="mat-elevation-z8"
>
....
</table>

但是我们传给table的数据大部分情况下都是异步获取的,而在获取到数据之前,mat-table就已经加载了。此时就会出现这样一个报错:

main.ts:11 ERROR TypeError: Cannot read properties of undefined (reading 'length')
at MatTable._getAllRenderRows (table.mjs:1635:40)

出现此错误的原因在于,mat-table在渲染的时候,此时dataSource是undefined或null,导致mat-table访问数据源并获取length值的时候出现上述错误。

  • 解决方法

    • 在ts中,按如下方法定义dataSource,就使用这么简单的一句定义,就可避免在初始化的时候发生报错。
dataSource = new MatTableDataSource();

在数据源为空的时候,如果让table不显示?

  • 背景

    • 上面我们讲到使用mat-table的时候,你都需要传入一个数据源dataSource。而如果你这个dataSource为空数组,那么在前端页面渲染的时候,依然会展示出表头,只不过表格内部显示空白而已。而这显然是毫无意义的,既然没有数据,就直接隐藏表格不展示就是,根本用不着展示表头。
  • 解决

    将table和分页器mat-paginator包裹在一个section里,然后给这个section设置如下hidden 条件即可。

<section
      [hidden]="!dataSource || !dataSource.data || dataSource.data.length === 0"
>
  <table
        mat-table
        matSort
        [dataSource]="dataSource"
        class="mat-elevation-z8"
  >
  ....
  </table>
  <mat-paginator
        class="datatable-paginator"
        [pageSizeOptions]="[5, 10, 20, 50, 100]"
        pageSize="50"
        showFirstLastButtons
      >
  </mat-paginator>
</section>

有人可能疑问为何不用*ngif而要用hidden?主要原因是如果用了ngif则里面的分页器mat-paginator就会失效,但具体原因尚不清楚。