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)方法:
对于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; }