0

我有一个显示大量数据的 jqgrid。通过 jquery ajax 调用(在 jqgrid 逻辑之外)定期从服务器检索数据。将检索到的数据与之前重试的数据进行比较(并在 js 中存储为 var。它用作 jqgrid 的数据)。如果它们不同,则刷新本地数据,然后触发 jqgrid 重新加载。jqgrid 数据类型是 jsonstring。

此解决方案运行良好,除非用户在过滤器工具栏中有过滤器值。因为我设置了一个 0.1 秒的计时器来触发 loadcomplete 事件中的过滤器,所以当有过滤器字符串时,整个网格刷新如下所示:

  • 最初在 jqgrid 中显示了 20 条记录(因为用户正在过滤列中的某个值)
  • jqgrid 被刷新,因为分开的 ajax 调用从服务器轮询的数据与浏览器中存储的数据不同
  • jqgrid 将在很短的时间内显示所有新数据
  • jqgrid 过滤器在 loadcomplete 内触发。屏幕再次显示 20 条记录。

它在技术上仍然有效。但是有没有办法在可视化网格之前在 jsonstring 上本地重新应用过滤器?换一种说法,jqgrid 可以只可视化一次,这将同时加载新的 jsonsting 并应用之前放置在过滤器框中的过滤器?

谢谢卡比

更新:

我尝试了 Oleg 的一种解决方案,在重新加载网格时应用过滤器。这是演示。只要数据类型是本地的,它就可以完美地工作。我的页面实际上使用数据类型 jsonstring 来重新加载网格。代码中的这个函数似乎确实适用于 jsonstring。我希望在外部 jquery ajax 成功从服务器检索数据后调用这样的函数。

function filter() {
            var searchFiler = $("#filter").val(), f;

            if (searchFiler.length === 0) {
                grid[0].p.search = false;
                $.extend(grid[0].p.postData,{filters:""});
            }
            f = {groupOp:"OR",rules:[]};
            f.rules.push({field:"name",op:"cn",data:searchFiler});
            f.rules.push({field:"note",op:"cn",data:searchFiler});
            grid[0].p.search = true;
            $.extend(grid[0].p.postData,{filters:JSON.stringify(f)});
            grid.trigger("reloadGrid",[{page:1,current:true}]);
        }

有人可以帮帮我吗?非常感谢。

4

1 回答 1

2

datatype: "jsonstring"与 的用法相比, 的用法存在细微差别datatype: "local"您可以在此处比较代码的相应部分。代码的差异之一是和函数datatype: "local"的用法。最后一个函数 ( ) 将仅在虚拟滚动 (或) 的情况下使用。在您的情况下,和之间的重要区别是.addLocalDatapopulateVisiblepopulateVisiblescroll: 1scroll: truedatatype: "jsonstring"datatype: "local"addLocalDatadatatype: "local"

该功能addLocalData适用​​于本地数据的分组和过滤(请参阅此处)。此外,它会将显示的行列表剪切到当前页面(请参见此处)。

因此,如果服务器返回未过滤的数据并且您需要显示过滤后的数据,那么您应该datatype: "local"使用datatype: "jsonstring". 而不是datastr你应该使用data. 您可能需要使用localReader而不是jsonReader(请参阅文档)或只是手动将从服务器返回的数据转换为默认可以读取的格式localReader

更新:在另一个答案中,我描述并包含了演示如何localReader使用的演示。

您还可以做的是将服务器返回的输入数据转换为标准格式(或以该格式从服务器返回数据)。data参数应该是命名对象的数组,其属性类似于colMode. 所以你可以做的只是一个简单的遍历rows数组并以 jqGrid 所需的格式创建另一个数组。相应的代码可能如下:

// let us you have myImput with myImput.rows
// and you have cm which you use as the value of colModel parameter
var mydata = [], input = myImput.rows, l = input.length,
    cmLength = cm.length, i, j, inputItem, item;
for (i = 0; i < l; i++) {
    inputItem = input[i];
    item = {id: inputItem.id};
    inputItem = inputItem.cell;
    for (j = 0; j < cmLength; j++) {
        item[cm[j].name] = inputItem[j];
    }
    mydata.push(item);
}

经过这样的转换,您可以使用mydata数组作为data参数的值。

于 2012-10-20T12:05:00.037 回答