可以重新加载网格数据(远程)并保留过滤器吗?

It's possible to reload the grid data (remote) and keep the filters?

我有一个按钮负责将新数据添加到数据库,然后我需要用新数据重新加载网格,但我想保留我之前应用的过滤器。这是函数的样子:

$('#create-link').on('submit', function (e) {
    e.preventDefault();

    $.ajax({
        url: '/ajax/plans_to_forms/save',
        data: $(this).serialize(),
        type: 'POST',
        dataType: 'json'
    }).done(function () {
        $grid.jqGrid('setGridParam', {datatype: 'json'}).trigger('reloadGrid');
    });
});

这一行:$grid.jqGrid('setGridParam', {datatype: 'json'}).trigger('reloadGrid'); 是重新加载远程数据的技巧,但我丢失了过滤器。

有没有什么办法可以在重新加载网格数据后保留它们,以便我返回到以前的数据而不是所有数据?

在添加新项目之前,已应用过滤器并且一切正常:

添加新项目后,过滤器没有应用,我得到了所有数据,所以我必须清除过滤器并重新设置它们:

Note: the new item belongs to the same Plan so it should appear there

有可能,但是这个问题是由很多小问题组成的。首先应该了解重新加载和过滤的工作原理,哪些 jqGrid 参数对此很重要,然后必须在程序中实现相应的小步骤。

第一个问题是在使用 loadonce: true 选项的情况下从服务器重新加载数据。您目前使用的代码

$grid.jqGrid('setGridParam', {datatype: 'json'}).trigger('reloadGrid');

但免费的 jqGrid 允许这样做

$grid.trigger('reloadGrid', {fromServer: true});

或者。免费的 jqGrid 在内部 dataTypeOrg 选项中保存原始 datatype 值("json"、"jsonp"、"xml" 等)并从中恢复 datatype dataTypeOrg 如果使用选项 fromServer: true。重要的是要了解 local 过滤只不过是重新加载网格,其中有 datatype: 'local'。因此,如果想使用强大的 local[=51,则不应在所有重新加载时 不使用 fromServer: true(不应永久使用 reloadGridOptions: { fromServer: true }) =] 对从服务器加载的数据进行排序和过滤。

第二个问题是过滤从服务器返回的数据然后数据将显示在 jqGrid 中。这在旧的 jqGrid 中是不可能的,但是免费的 jqGrid 有选项 forceClientSorting: true,它很厚。选项的名字不太好,但我不想改,因为已经用过了。选项强制本地排序过滤数据之前从服务器加载的数据的第一页将显示在网格中

下一个问题是用来自过滤器的数据填充过滤器工具栏,包括显示过滤器操作(如果使用 filterToolbarsearchOperators: true 选项)。默认情况下激活的选项 loadFilterDefaults: true 可以执行此操作。这是一个额外的免费 jqGrid 选项,它在旧的 jqGrid 中不存在。结果像

这样的设置
postData: {
    filters: JSON.stringify({
            groupOp: "AND",
            groups: [],
            rules: [
                {field: "ship_via", op: "ne", data: "FedEx"},
                {field: "closed", op: "eq", data: true},
                {field: "name", op: "bw", data: "test"}
            ]
    })
},
search: true,
forceClientSorting: true

用于https://jsfiddle.net/OlegKi/hvwn1tf7/3/做所有需要的事情。

接下来应该考虑的主要是 saving/restoring postData.filters 和设置 search: true(如果要应用过滤器),但它是如何工作的,那么就可以很容易地实现所需的行为。