分享

Easyui Datagrid增删改及后台交互(java)

 和帅书馆 2017-09-22

最近项目的特殊性可算是把我折腾得够呛,从最开始的整站JS,到现在的Liferay,且不说后台,单单前台框架就让我从Dojo到YUI又到AUI、jQuery、ExtJS,常用API翻了一遍,常见问题解决了一遍,而归根结底,为的就是一个方便好用、加载迅速的Grid控件。还好目前是定准用ExtJS了,不然常用控件都用一遍也没找到完全合适的,就困难了。题外话至此,下面开始正题。

刚刚看到同学在之前发的文章,在使用Easyui DataGrid时遇到新增行数据在保存时不能获取的问题,解决方法是在保存时先执行$(‘#example′).datagrid(‘acceptChanges’);然后前台获取全部行,再拼装字符串传到后台,这样做是可以解决,但实际上Easyui Datagrid似乎有更好的API供调用。为了和我一样的新手少走弯路,故写此篇文章以便参考。

例子如下:

  1. <table id="example"></table>
  2. <script type="text/javascript">
  3. easyloader.locale = "zh_CN";
  4. easyloader.theme = "gray";
  5. using(['datagrid'], function () {
  6. //new Datagrid的代码写在这里,下面是Datagrid中相应按钮调用的方法,是根据官方demo复制过来的。这里推荐使用easyloader,因为他是easyui实现的动态加载模块,个人认为会比一个个引入好点。
  7. });
  8.  
  9. var editIndex = undefined;//标示当前编辑行,提高效率,避免使用each遍历所有行来关闭正在编辑的行。
  10. function endEditing(){
  11. if (editIndex == undefined){return true;}
  12. if ($('#example').datagrid('validateRow', editIndex)){
  13. var ed = $('#example').datagrid('getEditor', {index:editIndex,field:'productid'});
  14. var productname = $(ed.target).combobox('getText');
  15. $('#example').datagrid('getRows')[editIndex]['productname'] = productname;
  16. $('#example').datagrid('endEdit', editIndex);
  17. editIndex = undefined;
  18. return true;
  19. } else {
  20. return false;
  21. }
  22. }
  23.  
  24. function onClickRow(index){
  25. if (editIndex != index){
  26. if (endEditing()){
  27. $('#example').datagrid('selectRow', index).datagrid('beginEdit', index);
  28. editIndex = index;
  29. } else {
  30. $('#example').datagrid('selectRow', editIndex);
  31. }
  32. }
  33. }
  34.  
  35. function append(){
  36. if (endEditing()){
  37. $('#example').datagrid('appendRow',{status:'P'});
  38. editIndex = $('#example').datagrid('getRows').length-1;
  39. $('#example').datagrid('selectRow', editIndex).datagrid('beginEdit', editIndex);
  40. }
  41. }
  42.  
  43. function remove(){
  44. if (editIndex == undefined){return}
  45. $('#example').datagrid('cancelEdit', editIndex).datagrid('deleteRow', editIndex);
  46. editIndex = undefined;
  47. }
  48.  
  49. function accept(){
  50. if (endEditing()){
  51. var inserted = $dg.datagrid('getChanges', "inserted");
  52. var deleted = $dg.datagrid('getChanges', "deleted");
  53. var updated = $dg.datagrid('getChanges', "updated");
  54. var effectRow = new Object();
  55. if (inserted.length) {
  56. effectRow["inserted"] = JSON.stringify(inserted);
  57. }
  58. if (deleted.length) {
  59. effectRow["deleted"] = JSON.stringify(deleted);
  60. }
  61. if (updated.length) {
  62. effectRow["updated"] = JSON.stringify(updated);
  63. }
  64. $.post("commit", effectRow, function(response) {
  65. if(response.status){
  66. $("#example").datagrid('acceptChanges');
  67. }
  68. }, "JSON");
  69. }
  70. }
  71.  
  72. function reject(){
  73. $('#example').datagrid('rejectChanges');
  74. editIndex = undefined;
  75. }
  76.  
  77. function getChanges(){
  78. var rows = $('#example').datagrid('getChanges');
  79. console.log(rows);
  80. }
  81. </script>

如上所示,在保存时,其实可以根据新增、修改、删除,三种状态来区分具体数据,而在保存之前需要调用endEdit,所以文章一开始说的问题就很明显了,不是直接acceptChanges而是要先endEdit,之后就能拿到新插入的数据了。而提交的时候可以使用JSON.stringify(object);得到json字符串后提交,后面就是使用ajax请求传递字串给后台了。这里要说一下,使用这个JSON.stringify的时候,我在IE下面有点问题,不知道是不是我使用easyloader的问题,时间关系,我没深究,因为我们使用的Liferay本身集成有AUI(其实就是YUI的扩展),我就直接调用A.JSON.stringify了,如果大家在使用的时候有遇到问题,可以找其他object to json的转换方式,同时也欢迎大家转告给我,以便整理出更简明、完善的例子。

下面简单说明一下后台获取方式,因为前台提交时用的是对象,里面最多也就三个元素,分别为inserted、deleted、updated,所以在后台直接通过request直接get就能得到String型的json数组。我的方式是把数组直接转换为List<String,Map<String,String>>转换的话就是要json.simple的JSONParser。如果需要直接转换bean或者其他的话可以根据自己的思路转换,这里只说明自己的简单实现。毕竟现在不用了,没研究那么多



    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约