free-jqGrid(4.15.4),服务器过滤器,客户端排序和分页?

时间:2019-01-28 16:10:40

标签: javascript c# free-jqgrid

尝试基于多重搜索/过滤器从服务器加载数据,但在客户端上进行排序和分页。我发现一些帖子说可以将beforeSearch方法中的数据类型简单地设置回原始值。

我尝试了此操作,并且确实针对服务器执行了该操作并返回了正确的数据。但是,第二次我过滤它似乎是从服务器获取数据,但随后在下面显示的jqgrid代码的第4429行上将其清除。关于如何实现这一目标的任何想法?

  

Ln 4429:p.lastSelectedData = query.select();

网格定义:

$element
    .jqGrid({
        cmTemplate: { search: true, searchoptions: { attr: { placeholder: "filter..." }, clearSearch: true }, sortable: true, align: "center" },
        colModel: [
            { name: "Id", key: true, hidden: true, searchoptions: { searchhidden: true, sopt: ["eq"] } },
            { name: "TransmissionId", label: "Transmission Id", searchoptions: { sopt: ["eq"] } },
            { name: "Name", label: "Name", searchoptions: { sopt: ["cn"] } }
        ],
        datatype: "json",
        loadonce: true,
        height: "auto",
        ignoreCase: true,
        pager: $("#" + pagerId),
        pgbuttons: true,
        pginput: false,
        rowList: [10, 25, 50],
        rowNum: 10,
        toppager: true,
        url: "url here",
        loadComplete: function (data) {
            if (this.p.datatype === "json") {
                setTimeout(function () {
                    $element.trigger("reloadGrid", [{ page: 1 }]);
                }, 50);
            }
            return data;
        },
        viewrecords: true
    })
    .jqGrid("filterToolbar", {
        autosearch: true,
        defaultSearch: "cn",
        beforeSearch: function () {
            $element.setGridParam({ datatype: "json", page: 1 });
        }
    })
    .jqGrid("navGrid", "#" + pagerId, {
        edit: false,
        add: false,
        del: false,
        refresh: false,
        view: false,
        cloneToTop: true
    });

我已整理网格以尝试确认不是导致此问题的自定义逻辑。网格确实启用了multipleSearch。但上面没有定义。

1 个答案:

答案 0 :(得分:1)

如果我正确理解您的问题,那么您应该将forceClientSorting: trueloadonce: true结合使用。它强制从服务器加载的数据在从服务器加载后直接进行排序,过滤和分页本地。因此,您可以删除当前使用的loadComplete。有关演示,请参见the answer

此外,您可以添加searching属性,其中包含filterToolbarsearchGrid的所有选项:

searching: {
    autosearch: true,
    defaultSearch: "cn",
    beforeSearch: function () {
        var p = $(this).jqGrid("getGridParam"), // get reference to all parameters
            filters = JSON.parse(p.postData.filters);
        p.datatype = "json";
        // one can here analyse filters, modify it or clear it as
        p.postData.filters = "";
        // one can set any other parameters, which will be sent to the server
        // by using p.postData.param1 = "value1";
        // which will sent param1=value1 to the server.
    }
}

通常,您也可以在当前的beforeSearch内部执行相同的操作。

更新:可能您应该另外使用beforeProcessing回调。从服务器接收到数据后,将直接调用beforeProcessing。在回调内部,您可以清理所有p.postData.filters(至"")和p.search(将其从true更改为false)。结果,jqGrid将尝试通过postData.filters从服务器返回的数据来本地过滤。