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 执行分页查询,前端只接收单页数据,性能更优。

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

相关推荐
用包装物1 小时前
表单草稿自动保存:断网不丢数据
低代码
wujiuhsu2 小时前
图片里的简体中文怎么翻译成繁体?商品图、详情页和海报批量转换方法
经验分享·笔记
SL_staff3 小时前
低代码选型避坑指南:为什么‘能拖拽’不等于‘能交付’?——基于JVS八大引擎的四维交付能力评估框架
java·低代码·spring cloud
keyipatience5 小时前
JS学习笔记(2)数组,函数,作用域,对象
前端·javascript·笔记·学习·html
你想知道什么?6 小时前
词向量总结-学习笔记
人工智能·笔记·学习
He BianGu6 小时前
【笔记】WPF中RenderOptions类的详细功能
笔记·wpf
用AI来创业吧6 小时前
网站建设公司哪家好:报价差 3 倍,差在哪四项成本上(选型笔记)
笔记·性能优化·软件工程·安全威胁分析
一支蜉蝣8 小时前
Day25 XD安全笔记 安全开发-PHP 应用&文件管理模块&包含&上传&遍历&写入&删除&下载&安全
笔记·网络安全·php
Awh-8 小时前
ARM 裸机开发 DAY10 学习笔记
arm开发·笔记·学习
He BianGu8 小时前
【笔记】WPF中CachingHint的功能
笔记·wpf