Filter jqGrid正在尝试在网格创建时应用筛选器

Filter jqGrid正在尝试在网格创建时应用筛选器,filter,jqgrid,Filter,Jqgrid,我有一个包含以下筛选器字符串的对象: prefs.filters={"groupOp":"AND","rules":[{"field":"FirstName","op":"cn","data":"max"}]} 这是我的网格创建,我尝试在postData设置中应用过滤器: // Set up the jquery grid $("#jqGridTable").jqGrid( { // Ajax relate

我有一个包含以下筛选器字符串的对象:

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。

如果希望应用
过滤器,则必须设置jqGrid的
搜索:true
选项。此外,还可以使用
数据类型:“json”
。这意味着
过滤器
将被发送到服务器,您的服务器代码必须解码过滤器并在那里使用。还有一句话。
postData
的正确值应该是
{filters:JSON.stringify(prefs.filters)}

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

loadonce:true,
forceClientSorting:对,
搜索:对,
postData:{filters:prefs.filters},
sortname:prefs.sortCol,
排序器:prefs.sortOrd
删除
loadComplete
您在问题的“评论后更新”部分发布的代码。Free jqGrid将加载从服务器返回的所有数据,在本地应用筛选器
prefs.filters
,在本地对结果进行排序,并显示结果的第一页(基于页面大小
rowNum:20

从服务器加载,在本地对数据进行排序,并按
isFinal==1
进行筛选,最后显示结果的第一页。演示使用另外的自定义排序,使用
sortfunc
additionalProperties
,这允许在本地
数据中保存额外的属性


您还可以将
reloadGridOptions:{fromServer:true}
添加到您使用的
navGrid
的其他选项中(
refresh:true,add:false,
)。如果用户单击导航栏的“刷新”按钮,它将更改该按钮的行为,以从服务器重新加载数据。请参阅,我今天发布了这篇文章,了解有关免费jqGrid和
loadonce:true的新选项的更多信息。我应用了您的建议,现在grid不加载。我删除了search:true,它加载时不带过滤器。我使用的是.navGrid,所以不确定它是否与search:true冲突。您提到了数据类型:json和服务器上的解码。一个问题是,当按下寻呼机栏上弹出的搜索按钮时,我是在过滤现有的网格数据,还是用过滤器重新查询数据并重新加载网格?@MaxAx:如果使用
datatype:“json”
,那么所有逻辑都必须在服务器代码中实现:排序、分页和过滤。如果你问这个问题,我可以假设你没有实现它。如果您没有那么多的数据项(如果总行数少于1000行,则肯定是这样),则重新开始使用
loadonce:true
。服务器应该一次返回所有数据。不需要在服务器上编写其他代码。客户端代码为您实现排序、分页和过滤。我有点困惑。也许我不明白什么。我的观察和问题:如果我可以在网格创建中设置sortname和sortorder,就像我在上面的帖子(更新)中一样,并且在网格加载时可以很好地应用,为什么在网格创建时我在postData中的过滤器不会应用呢?我根据您所说的(和其他帖子)应用了更改(请参阅帖子中的更新),并且过滤器按预期工作。现在我的列排序有点奇怪(见上面的更新)。@MaxAx:您使用的是哪个版本的jqGrid?我从2014年底开始开发fork。我实现了许多特性。例如,可以将
forceClientSorting:true
选项与
loadonce:true
结合使用。因此,您可以设置
search:true,postData:{filters:prefs.filters},sortname:prefs.sortCol,prefs.sortOrd
,并从
loadComplete
中删除任何代码。Free jqGrid将从服务器加载数据,并在显示第一页之前在本地应用排序和筛选。这正是你需要的。