取消请求时,jqGrid会丢失选择

时间:2013-07-12 15:29:37

标签: jqgrid

如果用户有任何不想丢失的选择,我需要允许用户取消jqGrid(版本4.4.1)分页或排序操作。

我最初尝试在beforeRequest事件处理程序中处理这个问题但是当我调用selarrrow函数时,总会返回一个空数组,因为选择似乎已被清除。

然后我尝试添加onPagingonSorting事件处理程序,其中选项可通过selarrrow函数获得,但是,当我从这些函数返回'stop'以取消请求时(如jqGrid documentation中所指定的那样,选择仍然似乎已被清除。请注意,行仍然会在网格中显示,但selarrrow会返回一个空数组。

我猜这是一个jqGrid缺陷,但是有人知道它是否已在更新的版本中得到修复,或者是否有配置解决方法?

2 个答案:

答案 0 :(得分:1)

我认为使用onPaging时只有一个错误。如果方法返回"stop",则选择仍然清除。原因是代码片段中的the lines的顺序

clearVals = function(onpaging){
    var ret;
    if ($.isFunction(ts.p.onPaging) ) { ret = ts.p.onPaging.call(ts,onpaging); }
    ts.p.selrow = null;
    if(ts.p.multiselect) {ts.p.selarrrow =[]; setHeadCheckBox( false );}
    ts.p.savedRow = [];
    if(ret==='stop') {return false;}
    return true;
};

正确的代码应该是

clearVals = function(onpaging){
    var ret;
    if ($.isFunction(ts.p.onPaging) ) { ret = ts.p.onPaging.call(ts,onpaging); }
    if(ret==='stop') {return false;}
    ts.p.selrow = null;
    if(ts.p.multiselect) {ts.p.selarrrow =[]; setHeadCheckBox( false );}
    ts.p.savedRow = [];
    return true;
};

您可以在2041之后移动版本4.5.2的if(ret==='stop') {return false;}的{​​{1}}(对应于版本4.4.1中的第1902行)(版本中的第1898行) 4.4.1)(在jquery.jqGrid.src.js之后)修复错误。

if ($.isFunction(ts.p.onPaging) ) { ret = ts.p.onPaging.call(ts,onpaging); }的使用似乎是正确的,如果回调返回onSortCol字符串,则选择应保持不变。

更新:我发布了相应的芽修复作为拉取请求。它今天合并(见here)到jqGrid的主要代码。因此,下一个版本(> 4.5.2)应该没有您所描述的更多问题。

答案 1 :(得分:0)

这是我为此问题制定的解决方法(请注意:它需要Underscore.js)但是如果有人有一个更清洁的解决方案,则感兴趣:

var tempSelections,
    myGrid = $("#mygrid"),
    checkSelections = function() {
        var selections = myGrid.jqGrid("getGridParam", "selarrrow");
        if (selections && selections.length > 0) {
            tempSelections = selections;
        }
    }; 

myGrid.jqGrid({
    ... //settings
    multiselect: true,
    onPaging: checkSelections,
    onSortCol: checkSelections,
    beforeRequest: function() {
        if (tempSelections && tempSelections.length > 0) {
            if (!confirm("Do you want to clear the selections on this page?")) {
                _.forEach(tempSelections, function(selection) {
                    myGrid.jqGrid("setSelection", selection);
                });
                tempSelections = null;
                return false;
            }
            tempSelections = null;
        }
        return true;
    }
});