KingFusion系列34-KingFusion表格控件翻页问题分析与解决

今天在用KingFusion开发MES系统的过程中遇到表格控件翻页时显示异常的情况,

KingFusion开发平台中的表格控件,查询后显示有11页内容,点击下一页翻页按钮,第一下点击正常,第二下点击后图表无数据。

问题根本结论

遇到的翻页异常,核心原因是手动编写的客户端分页逻辑,与 KingFusion 底层 EasyUI Datagrid 的原生分页机制产生了严重的状态冲突,两次翻页后分页器的事件绑定、数据总量、页码状态彻底错乱,最终表现为表格无数据、分页信息异常(变为 1 页共 50 条)。


详细原因拆解

1. 分页逻辑重复实现,原生与自定义逻辑冲突

EasyUI Datagrid 开启 pagination: true 后,如果传入全量本地数据,组件会自动完成客户端分页 ,自动计算总页数、自动处理翻页切片,完全不需要手动写 onSelectPage 和 slice 逻辑。

手动重写了分页器的 onSelectPage 事件,相当于在原生分页机制之上又套了一层自定义分页,两套逻辑同时运行、互相覆盖状态,是问题的根源。

2. loadData 传入单页数据,破坏组件内部总数据量

在翻页回调中,用 loadData(data1.slice(start, end)) 只传入了单页的 50 条数据。这会让 Datagrid 内部认为「全量数据就只有这 50 条」,原生逻辑会自动把分页总条数改成 50、总页数改成 1。

虽然你紧接着用 pager.pagination('refresh') 手动把总条数改回了 535,但这只是修正了表面显示,组件内部的状态、事件绑定已经被原生逻辑重置。

3. 两次翻页后状态彻底错乱的过程

  1. 初始查询

    :手动设置第一页数据,手动绑定自定义翻页事件,手动设置总条数 535,此时表面状态正常。

  2. 第一次翻页(第 2 页)

    :触发你写的自定义事件 → 加载第二页 50 条 → 原生逻辑立刻把总条数改成 50、页码改成 1 → 你的 refresh 又把显示改回 2 页、535 条。这个过程极快,用户看不到异常,但分页器的 onSelectPage 事件已经被原生逻辑重置回默认函数。

  3. 第二次翻页(第 3 页)

    :此时触发的已经是原生的翻页逻辑,不再是你写的自定义函数。原生逻辑发现当前表格只有 50 条数据、每页 50 条,判定只有 1 页,于是直接回退到第 1 页、总条数 50,且没有全量数据可以切片,最终表格显示为空。

4. 额外风险点

  • 每次查询都执行 $(id).datagrid({...}) 重新初始化整个组件,会销毁原有事件和状态,存在残留风险。

  • 属性面板中 onLoadSuccess 已经绑定了脚本,而每次 loadData 都会触发该事件。如果事件内有数据重置、重新初始化等逻辑,会进一步加剧分页状态错乱。


修复方案(推荐原生分页,最稳定)

直接删掉所有手动分页代码,使用 Datagrid 原生的客户端分页能力,传入全量数据即可,组件会自动处理翻页、计算总页数,彻底避免逻辑冲突。

修正后的查询按钮完整代码

javascript 复制代码
var c_Area = CBox区域.GetCurrentText();
var c_ProcessName = Cbox工序名称.GetCurrentText();
var c_VariableName = Cbox变量名称.GetCurrentText();
$Variable.pageName = this.getName();
var condition = {
"c_Area": c_Area,
"c_ProcessName": c_ProcessName,
"c_VariableName": c_VariableName
};
var M = {
"type": 2,
"condition": condition
};
requestCalculationPost($System.RFM_SY, 'SY_ProcessVariable', M, function (res) {
if (res.Code 
= 0 && res.errorCode = 0) {
var resdata = res.records || [];
if (resdata.length === 0) {
$Function.tip('info', '未找到相关信息!');
}
    var id = Datagrid1.id;
    // 核心修改:直接传入全量数据,原生自动分页,无需手动切片
    $(id).datagrid({
        fitColumns: true,
        pagination: true,
        pageSize: 50, // 与你界面选择的每页条数保持一致
        pageList: [10,20,30,40,50],
        data: resdata
    });
} else {
    $Function.tip('error', res.message);
}
});

额外检查与优化建议

  1. 检查 onLoadSuccess 事件:打开该事件的脚本,确认里面没有重新加载数据、重置分页、重新初始化表格的逻辑;如果有,同步删除或调整。

  2. 移除重复初始化 :如果查询按钮只会点击一次,无需每次都 $(id).datagrid({...}) 全量初始化,可以改用 loadData 方法加载全量数据,性能更好:

javascript 复制代码
// 替换上面的初始化代码,仅更新数据
$(id).datagrid('loadData', resdata);
  1. 数据量较大时的优化:如果后续数据量超过 2000 条,建议改成服务端分页,由 SQL 执行分页查询,前端只接收单页数据,性能更优。

修改后重新测试翻页,无论点多少次下一页,都会稳定正常。

相关推荐
一隅论数智4 天前
给AI一张“业务概念地图“:本体如何从哲学走向企业智能
大数据·人工智能·经验分享·笔记·学习·学习方法·政务
深圳老胡4 天前
STM32F407 控制 L6470 步进电机驱动 —— 控制过程简介
笔记·stm32·单片机·嵌入式硬件·代码规范
Because_of_Her14 天前
并查集-听课笔记
笔记·算法·并查集
彧azz4 天前
Linux 环境下 Redis 学习总结:数据类型、持久化、锁、事务、主从与缓存问题
linux·redis·笔记·学习·面试
陈卫军老师4 天前
陈卫军:把口味写在一张纸上,店才稳得住
经验分享·笔记·流量运营
`流年づ4 天前
人工智能学习笔记 - 补充
人工智能·笔记·深度学习·学习
qeen874 天前
【Linux】操作系统之进程介绍(二)
linux·笔记·学习·进程
从零开始的嵌入式之旅4 天前
day47
arm开发·经验分享·笔记·嵌入式硬件
陈年老古董4 天前
MediaPipe 姿态检测与脸部关键点检测
笔记·python·opencv·学习·dlib
彧azz4 天前
操作系统时间管理与系统核心板块学习总结
c语言·笔记·学习·系统架构