1

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

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

然后我尝试添加onPagingonSorting事件处理程序,其中可以通过selarrrow函数获得选择,但是,当我从这些函数返回“停止”以取消请求时(如jqGrid 文档中所指定),选择似乎仍然被清除。请注意,行仍然在网格中显示为选中状态,但selarrrow返回一个空数组。

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

4

2 回答 2

1

我认为在使用onPaging. 如果方法返回"stop",选择仍然被清除。原因是代码片段中的行顺序

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;
};

您可以将 4.5.2 版本的第 2045 行(与4.4.1 中的第 1902 行对应if(ret==='stop') {return false;})移到jquery.jqGrid.src.js2041(4.4.1 版本中的第 1898 行)之后(在 之后if ($.isFunction(ts.p.onPaging) ) { ret = ts.p.onPaging.call(ts,onpaging); })以修复该错误。

的用法onSortCol似乎是正确的,如果回调返回"stop"字符串,则选择应保持不变。

更新:我将相应的芽修复发布为拉取请求。它今天(见这里)合并到 jqGrid 的主要代码中。所以下一个版本(> 4.5.2)不应该有更多你描述的问题。

于 2013-07-12T16:51:56.787 回答
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;
    }
});
于 2013-07-12T16:11:14.453 回答