【问题标题】:free-jqGrid (4.15.4), server filter, client sorting and paging?free-jqGrid (4.15.4)、服务器过滤器、客户端排序和分页?
【发布时间】:2019-01-28 16:10:39
【问题描述】:

尝试基于多搜索/过滤器从服务器加载数据,但在客户端进行排序和分页。我发现一些帖子说只需将数据类型设置回 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。但上面没有定义。

【问题讨论】:

    标签: javascript c# free-jqgrid


    【解决方案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从服务器返回的数据过滤本地

    【讨论】:

    • 我只寻找排序/页面客户端。我打算发送到服务器以将不同的数据集返回给客户端的过滤器。
    • @XBiLe:我还是不明白你目前的问题。 filterToolbar 填充 postData.filters 并调用 beforeSearch。您可以在postData 中进行任何更改。然后filterToolbar 设置search: true 并触发reloadGrid。如果datatype"local" 更改回"json",那么jqGrid 将发送postData 到服务器(您的url 网格)。因此,您可以完全自定义将发送到服务器的数据。是你问的吗?
    • 抱歉,我并不想让这变得混乱。目标是使用过滤器从服务器查询新数据集,但在浏览器上本地分页和排序。问here 几乎是一样的。我的问题是我第二次从服务器获取数据时,方法addLocalData 触发query.select() 删除新数据集。我正在逐步执行评估,但看起来执行 match 不为空(Ln 2034)
    • @XBiLe:如果没有重现问题的演示,很难帮助您。 p.lastSelectedData = query.select(); 这行肯定不是问题的根源。可能您应该另外使用beforeProcessing 回调。它会在从服务器接收到数据后直接调用。在回调内部,您可以清除所有p.postData.filters(到“”)和p.search(将其从true 更改为false)。结果 jqGrid 将尝试通过postData.filters从服务器返回的数据过滤本地
    • 我逐步浏览了 jqgrid JS 并找到了在我的示例中导致数据丢失的原因。这是 jlinq 处理,我的过滤器字段之一是 bool,在 eval 期间它执行 String(jQuery.jgrid.getAccessor(this,'IsSuccess') || '').toUpperCase(),由于 false bool 过滤器值导致空字符串。
    猜你喜欢
    • 1970-01-01
    • 2011-06-16
    • 2011-06-20
    • 1970-01-01
    • 2012-02-20
    • 1970-01-01
    • 1970-01-01
    • 2014-11-18
    • 2013-06-28
    相关资源
    最近更新 更多