最近使用jQuery easyUI 1.3.2 开发。在记录行设置一操作列,包含删除和编辑功能,操作后不reload重载(不发送新的数据库查询请求)。网上教程是在初始化数据的时候,将行号index传入,如下代码
formatter:function(value,row,index){ if (row.editing){ var s = '<a href="javascript:void(0);" class="savebtn" onclick="saverow("+index+")">保存</a> '; var c = '<a href="javascript:void(0);" class="cancelbtn" onclick="cancelrow("+index+")">取消</a>'; return s+c; } else { var e = '<a href="javascript:void(0);" class="editbtn" onclick="editrow("+index+")">编辑</a> '; var d = '<a href="javascript:void(0);" class="delbtn" onclick="deleterow("+index+")">删除</a>'; return e + d; } }
开始没有发现问题。能删除能编辑。后来发现,连续删除,或者删除后编辑,将出现很多奇怪的bug,比如删除错误数据,点击编辑,是另外的行触发了。究其原因,是这个行号index的问题。因为index是在初始化数据时定死的,但执行删除操作后,各行index是会变更的。而代码中的a标签调用的onclick方法里面的index已经固定,所以bug就来了。
最新版的1.4.1不知道有没有针对这个bug或者效果上做了调整,反正网上的处理方法很多是教直接修改easyUI的源码。
这里介绍一个简便一点的方法。
首先,将onclick方法传入index改为传this。
formatter:function(value,row,index){ if (row.editing){ var s = '<a href="javascript:void(0);" class="savebtn" onclick="saverow(this)">保存</a> '; var c = '<a href="javascript:void(0);" class="cancelbtn" onclick="cancelrow(this)">取消</a>'; return s+c; } else { var e = '<a href="javascript:void(0);" class="editbtn" onclick="editrow(this)">编辑</a> '; var d = '<a href="javascript:void(0);" class="delbtn" onclick="deleterow(this)">删除</a>'; return e + d; } }
然后,再各个onclick方法里面,就不能直接获取index使用了,需要改为
$(item).parents("tr").click(); var row = $dg.datagrid('getSelected'); var rowIndex = $dg.datagrid('getRowIndex', row);
用js控制点击时间,然后整行选中,再获取行号,搞掂。
效果图:
行内编辑