如何在调用Kendo UI Grid数据源read后仅修改分页器显示页码?
问题描述
调用Kendo UI for jQuery Grid的dataSource.read()方法后,如何通过代码修改网格的当前页码?使用dataSource.page(x)会触发transport的read()调用,进而陷入无限循环。当前数据状态正常,无需再次调用dataSource.read,仅希望修改网格分页器的视觉显示(例如显示“第7页/共100页”)。调用任何*.page(x)方法(数据源或分页器的)都会触发不必要的dataSource read请求。
相关代码示例:
const fRead = function (e) { // 模拟REST接口返回 const res = { data: [ { m: 1 }, { m: 2 }, { m: 3 }, { m: 4 }, { m: 5 }, { m: 6 } ], page: 2 }; return e.success(res); // 希望fRead执行后,网格的当前页码设置为2! } const newKnd = new kendo.data.DataSource({ schema: { model: { fields: { m: { type:"number" } } } }, pageSize: 6, pageable: true, serverPaging: true, serverSorting: true, sort: _sort, transport: { read: fRead, }, });
解决方案
以下几种方法可在不触发read()请求的前提下修改分页器显示页码:
方法1:通过schema的parse函数同步页码
在数据源的schema中添加parse函数,解析返回数据时直接修改数据源内部页码状态,不会触发read请求:
const newKnd = new kendo.data.DataSource({ schema: { model: { fields: { m: { type:"number" } } }, parse: function(response) { if (response.page) { // 解析阶段调用page()不会触发read请求 this.page(response.page); } return response.data; } }, pageSize: 6, pageable: true, serverPaging: true, serverSorting: true, sort: _sort, transport: { read: fRead, }, });
方法2:直接修改数据源私有属性并刷新分页器
手动修改数据源内部私有属性,然后强制刷新分页器显示:
// 可在grid的dataBound事件或read完成回调中执行 const grid = $("#yourGridId").data("kendoGrid"); const ds = grid.dataSource; // 修改内部页码和总页数(按需设置) ds._page = 2; ds._total = 100; // 刷新分页器 grid.pager.refresh();
注意:该方法依赖Kendo UI内部私有属性,版本更新时需验证兼容性。
方法3:临时禁用serverPaging后设置页码
先关闭serverPaging,设置页码后恢复,避免触发read请求:
const grid = $("#yourGridId").data("kendoGrid"); const ds = grid.dataSource; // 保存原serverPaging状态 const originalServerPaging = ds.options.serverPaging; // 临时禁用serverPaging ds.options.serverPaging = false; // 设置页码,无read请求 ds.page(2); // 恢复原状态 ds.options.serverPaging = originalServerPaging; // 刷新分页器 grid.pager.refresh();
内容的提问来源于stack exchange,提问作者mx7
相关产品推荐
相关产品推荐

