现在的位置: 首页 > easyui > Grid > datagrid > 正文
Bug:Easyui 1.3.2版本可编辑表格的rejectChanges方法造成的表格瘫痪
2013年01月09日 datagrid ⁄ 共 1300字 暂无评论 ⁄ 被围观 7,748 views+
文章目录
[隐藏]

Bug描述:

1.3.2版本刚刚发布,对于datagrid部分,就有人测试出了问题。在设置可编辑表格idField字段的前提下,如果我们使用appendRow方法追加一行,最后再使用rejectChanges方法撤销变更。经过这两部操作,选中,勾选行的时候就会报错,基本上整个表格就陷入瘫痪了。

原因分析:

rejectChanges方法内部有以下操作:

  • 1.获取到编辑状态的rows的行索引列表
  • 2.回滚掉appendRow,insertRow两个方法插入的rows(对于由appendRow和insertRow方法插入且在编辑中状态的rows,步骤1中已经获取到行索引,但是此时,这些行索引对应的rows数据已经被删除)
  • 3.根据步骤1中获取到的行索引,check和select行索引对应的rows(必然失败,因为对应的rows已被删除),进而存储在DOM上的jq数据的selectedRows和checkedRows数组有元素,但是元素为空。

以上过程产生的selectedRows和checkedRows数据就成了表格瘫痪的直接原因,因为选中或者勾选行的时候都会访问这两个数组。

解决方案:

修改源码方式:

将步骤2和步骤3调换一下顺序就可以了,这个体现在plugins/jquery.datagrid.js这个文件里的function _142(_143)方法:
datagrid_bug_1

对于jquery.easyui.min.js文件,请大家自行分析代码位置,不想改jquery.easyui.min.js的话,就在引入jquery.easyui.min.js之后再引入修改后的plugins/jquery.datagrid.js文件即可。

不修改源码方式:

不想修改源码的话,可以在rejectChanges方法调用后修正数据,例如:

function reject(){
    $('#dg').datagrid('rejectChanges');
    /*开始修复数据代码*/
    var data = $.data($('#dg')[0], "datagrid");
    var selectedRows = data.selectedRows;
    var checkedRows = data.checkedRows;
    var newSelectedRows = [], newCheckedRows = [];
    for (var i = 0; i < selectedRows.length; i++) {
        if (selectedRows[i] != undefined) {
            newSelectedRows.push(selectedRows[i]);
        }
    }
    for (var i = 0; i < checkedRows.length; i++) {
        if (checkedRows[i] != undefined) {
            newCheckedRows.push(checkedRows[i]);
        }
    }
    data.selectedRows = newSelectedRows;
    data.checkedRows = newCheckedRows;
	/*修复数据代码结束*/
    editIndex = undefined;
}

给我留言

留言无头像?


×