什么是RowModel
RowModel是aggrid用来加载数据的模型,不同模式,拥有不同的数据结构和方法, aggrid拥有4不同类型的RowModel;
- client-side
- server-side
- infinite
- viewport
4种模式对应不同的数据加载策略,通过rowModelType字段来进行控制,指定Id,4种模型都可以通过getRowId方法来指定;
client-side
一次性加载所有数据,根据官方数据,一次最多可以加载100k+行的数据,数据模型
该Model默认会使用虚拟列表,仅渲染可是区域内的数据,由此来保证,页面不会卡顿;
server-side
从服务端获取数据,默认用户滚动,会加载更多数据,比infinite支持更多功能,数据模型
该Model从服务端lazy-load数据,具体有以下两种策略:
1.如果有group,会在展开的时候,才加载group的child;
2.默认加载一屏数据,滚动才加载更多;
infinite
从服务端获取数据,默认用户滚动,会加载更多数据,数据模型
viewport
从服务端获取数据,和服务器交互当前用户正在看的内容,数据模型
四种模式,支持的功能不同,以下可以看到不同的点:
www.ag-grid.com/javascript-…
总体来说,client-side和server-side支持的功能基本相同,除了quick-filter和header selection不支持,其他都一样,通常将后端分页使用server-side,前端分页使用client-side模式
RowModel的使用
获取当前的model
使用gridRef.current.api.getModel()可以获取到当前table使用rowModel
从这里可以看到原始行、已应用筛选器后的行、已应用聚合后的行以及最后一组“要显示”的行
RowModel原理
RowModel遵循MVC原则;
从图上可以看出,1个row renderer 对应 1个pagination Proxy,对应1个row model,1个row model中包含n个row node;不同的rowModel拥有不同的数据结构和方法,但是都共同拥有4个方法,rowModelUpdated事件发出后,rowRenderer会进行refeshView
RowNode
更新
不同的rowModel,需要有不同的方式来更新view,默认是使用gridApi或者使用数据驱动,直接更改数据,grid有change detection,只要通过grid api更新了数据,会自动同步到对应的value上去; 但是如果更改了外部数据,但是grid的数据未同步,此时需要手动调用api;即使用通用方法
server-side
在client-side model模式下,有3种更新方式:
-
使用refreshServerSide(params) 指定当前grid开始刷新所有已经load的数据,支持根据传参不同,刷新不同级别路径的数据,不穿默认parent,传递path可以指定group/tree级别的数据
-
使用rowNode.setData和rowNode.updateData
-
使用transaction
applyServerSideTransaction
client-side
在client-side model模式下,有4种更新方式:
- 直接设置rowData
直接修改数据源,如果使用react,可以直接将rowData设置为state,更改即可,如果使用aggridapi,可以使用api.setRowData(newData)来进行update
对filters等功能的影响不明; - 使用RowNode API
rowNode.setData(data):设置data属性,会更新整行数据
rowNode.setDataValue(col,value):设置value属性,仅更新当前cell - 使用gridApi.applyTransaction(transaction)
使用于需要批量数据更新,会将transaction batch设置到界面上,transaction即为
function applyTransaction(rowDataTransaction: RowDataTransaction<TData>): RowNodeTransaction<TData> | null | undefined;
interface RowDataTransaction<TData = any> {
// Index to add rows
addIndex?: number | null;
// Rows to add
add?: TData[] | null; // Rows to remove
remove?: TData[] | null; // Rows to update
update?: TData[] | null;
}
interface RowNodeTransaction<TData = any> { // Row nodes added
add: [IRowNode]// (https://www.ag-grid.com/javascript-data-grid/row-object/)<TData>[]; // Row nodes removed
remove: [IRowNode]// (https://www.ag-grid.com/javascript-data-grid/row-object/)<TData>[]; // Row nodes updated
update: [IRowNode]// (https://www.ag-grid.com/javascript-data-grid/row-object/)<TData>[];
}
- 使用api.applyTransactionAsync(transaction)
适用于高频修改的场景,异步修改,会将transaction进行任务划分到更细的时间执行
view refresh方法
更改了外部数据,但是grid的数据未同步
1.api.refreshCells(cellParams)
仅刷新ui上的value和实际模型上value不同的cell,对传入的cell进行change detection,不传默认检测所有cell,按需刷新
2.api.redrawRows(redrawRowsParams)
remove 指定row的dom,并且重新绘制该row,开销更大,尽量使用refreshCells完成