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将从服务器加载数据,并在显示第一页之前在本地应用排序和筛选。这正是你需要的。