如何使用jqGrid,multiselection和Spring序列化删除数据?

时间:2012-04-24 15:54:53

标签: javascript spring jqgrid postdata

目前,我有一个被覆盖的delGridRow调用看起来像这样(归功于Krams和他的Spring教程):

var row = $('#grid').jqGrid('getGridParam','selrow');

$('#grid').jqGrid( 'delGridRow', row, 
        {   url:'deleteRequirement.html', 
            recreateForm: true,
            beforeShowForm: function(form) {
                //Change title
                $(".delmsg").replaceWith('<span style="white-space: pre;">' +
                        'Delete selected record?' + '</span>');
                //hide arrows
                $('#pData').hide();  
                $('#nData').hide();
            },
            reloadAfterSubmit:true,
            closeAfterDelete: true,
            serializeDelData: function (postdata) {
                var rowdata = $('#grid').getRowData(postdata.id);
                // append postdata with any information 
                return {id: postdata.id, oper: postdata.oper, reqID: rowdata.reqID};
            },
            afterSubmit : function(response, postdata) 
            { 
                var result = eval('(' + response.responseText + ')');
                var errors = "";
                    if (result.success == false) {
                    for (var i = 0; i < result.message.length; i++) {
                        errors +=  result.message[i] + "<br/>";
                    }
                }  else {
                    $('#msgbox').text('Entry has been deleted successfully');
                    $('#msgbox').dialog( 
                    {   title: 'Success',
                        modal: true,
                        buttons: {"Ok": function()  {
                            $(this).dialog("close");
                        } 
                    }
                });
            }
        // only used for adding new records
        var newId = null;
        return [result.success, errors, newId];
    }
});
else {
    $('#msgbox').text('You must select a record first!');
    $('#msgbox').dialog( 
            {   title: 'Error',
                modal: true,
                buttons: {"Ok": function()  {
                    $(this).dialog("close");} 
                }
            });
}

为了增加对多选删除的支持,我将“selrow”第一行更改为:

var rowList = jQuery("#grid").getGridParam('selarrrow');

在此之后,事情开始变得粗略。规范说默认的delGridRow可以接受要删除的输入记录数组。我做了以下更改以尝试获取新的'rowList'变量:

$('#grid').jqGrid( 'delGridRow', rowList, ...

我仍在我的Spring控制器中点击我的deleteRequirement.html网址,但只有最后的记录才能显示出来。我猜测问题出现在serializeDelData部分的postdata准备中,但是我没有找到正确的方法来准备这个postdata与记录列表而不是单个记录。

任何建议/见解都将受到赞赏。

谢谢大家。

1 个答案:

答案 0 :(得分:2)

我自己不使用Spring,但代码接缝的某些部分对我来说很奇怪。

首先,您可以在代码中使用delGridRowrow的第一个参数的两种形式。它可以是以逗号分隔的id列表,也可以是id数组。如果使用id数组,则jqGrid会将其rowids = rowids.join();转换为逗号分隔格式。因此,postdata.id内的serializeDelData格式也可以是以逗号分隔的ID列表。

因此,如果您需要支持删除多行,您应该

  1. 修改serializeDelData的代码,以便在reqID属性中发送reqID的列表。相应的代码可以是
  2. serializeDelData: function (postdata) {
        var ids = postdata.id.split(','), i, l = ids.length, reqIDList = [];
        for (i = 0; i < l; i++) {
            reqIDList.push($(this).jqGrid("getCell", ids[i], "reqID"));
        }
        return {id: postdata.id, oper: postdata.oper, reqID: reqIDList.join()};
    }
    
    1. 修改您的服务器代码,以逗号分隔的形式支持idreqID
    2. afterSubmit内回调你的行

      // only used for adding new records
      var newId = null;
      return [result.success, errors, newId];
      

      您可以将行修改为以下

      return [result.success, errors];
      

      因为只会使用afterSubmit回调返回的数组的前两个元素。