jqGrid尝试在网格创建上应用过滤器

时间:2016-02-08 14:58:40

标签: filter jqgrid

我有一个包含以下过滤字符串的对象:

prefs.filters={"groupOp":"AND","rules":[{"field":"FirstName","op":"cn","data":"max"}]}

这是我的网格创建,我试图在postData设置中应用过滤器:

        // Set up the jquery grid
        $("#jqGridTable").jqGrid(
            {
                // Ajax related configurations
                url: jqDataUrl,
                datatype: "json",
                mtype: "GET",
                autowidth: true,

                // Configure the columns
                colModel: columnModels,

                // Grid total width and height
                height: "100%",

                // customize jqgrid post init
                gridComplete: function()
                {
                    CRef.updateJqGridPagerIcons("jqGridTable");
                },

                // Paging
                toppager: true,
                rowNum: 20,
                rowList: [5, 10, 20, 50, 100],
                viewrecords: true, // Specify if "total number of records" is displayed

                // Default sorting
                sortname: typeof prefs.sortCol !== "undefined" ? prefs.sortCol : "LastName",
                sortorder: typeof prefs.sortCol !== "undefined" ? prefs.sortOrd :  "asc",
                sorttype: "text",
                sortable: true,

                postData: typeof prefs.filters !== "undefined" ? { filters: prefs.filters } : {},
                //also tried this...
                //postData: typeof prefs.filters !== "undefined" ? { JSON.stringify(filters: prefs.filters) } : {},

 //remaining property settings excluded from post to keep short.

更新:在网格上使用.navGrid,如下所示:

.navGrid("#jqGridTable",
                { refresh: true, add: false, edit: false, del: false, refreshtitle: getRefreshText('@Model.Instruction'), searchtitle: searchText },
                {}, // settings for edit
                {}, // settings for add
                {}, // settings for delete
                { closeAfterSearch: true, closeOnEscape: true, multipleSearch: true, multipleGroup: true });

创建网格时,不应用postData中的过滤器。我也尝试在初始创建后触发重载事件,并且也没有应用过滤器。

从其他帖子中,我相信我的路径正确,但似乎缺少了一些东西。

评论后更新:

我将以下代码添加到loadComplete ...

if ($("#jqGridTable").jqGrid("getGridParam", "datatype") === "json") {
    setTimeout(function () {

        $("#jqGridTable").jqGrid("setGridParam", {
            datatype: "local",
            postData: { filters: prefs.filters, sord: prefs.sortOrd, sidx: prefs.sortCol },
            search: true
        });

        $("#jqGridTable").trigger("reloadGrid");
    }, 50);
}

并成功保留了过滤器。 :)

然而,现在我有一个有趣的问题副作用。我可以对列进行排序,并且某些列将更改为正确排序asc / desc,但是当我转到其他人并进行排序时,它们按照它们最初加载的顺序排序,这既不是asc也不是desc。

1 个答案:

答案 0 :(得分:0)

如果您希望应用search: true,则必须设置jqGrid的filters选项。此外,您使用datatype: "json"。这意味着filters将只发送到服务器,您的服务器代码必须解码过滤器并在那里使用。再说一遍。 postData的正确值为{ filters: JSON.stringify(prefs.filters) }

更新:我建议您升级到最新版本(4.12.1)或free jqGrid。它是我自2014年底开发的jGrid的分支。要使用免费的jqGrid,您只需将jqGrid文件的URL更改为the wiki article中描述的URL即可。之后,您可以使用以下选项:

loadonce: true,
forceClientSorting: true,
search: true,
postData: { filters: prefs.filters },
sortname: prefs.sortCol,
sortorder: prefs.sortOrd

删除您发布的loadComplete代码"评论后更新"你问题的一部分。免费jqGrid将加载从服务器返回的所有数据,应用过滤器prefs.filters 本地,对结果本地进行排序并显示结果的第一页(基于页面大小rowNum: 20)。

The old demo从服务器加载the JSON data,在本地对数据进行排序并按isFinal === 1过滤,最后显示结果的第一页。该演示使用sortfuncadditionalProperties进行额外的自定义排序,允许在本地data中另外保存属性。

您还可以将reloadGridOptions: { fromServer: true }添加到您使用的navGrid的其他选项中refresh: true, add: false, ...。如果用户单击按钮,它将更改导航栏的“刷新”按钮的行为以从服务器重新加载数据。请参阅我今天发布的another answer,了解有关免费jqGrid和loadonce: true的新选项的更多信息。