我有一个按钮负责向数据库添加新数据,然后我需要用新数据重新加载网格,但我想保留我之前应用的过滤器。这就是函数的样子:
$('#create-link').on('submit', function (e) {
e.preventDefault();
$.ajax({
url: '/ajax/plans_to_forms/save',
data: $(this).serialize(),
type: 'POST',
dataType: 'json'
}).done(function () {
$grid.jqGrid('setGridParam', {datatype: 'json'}).trigger('reloadGrid');
});
});
这一行:$grid.jqGrid('setGridParam', {datatype: 'json'}).trigger('reloadGrid');
正在制作重新加载远程数据的技巧,但我正在失去过滤器。
有没有办法在重新加载网格数据后保留它们,所以我回到以前的数据而不是全部数据?
添加新项目后,过滤器尚未应用,我获得了所有数据,因此我必须清除过滤器并重新设置:
注意:新项目属于同一计划,因此它应该出现在那里
答案 0 :(得分:2)
这是可能的,但问题包括许多小问题。首先应该了解重新加载和过滤是如何工作的,哪个jqGrid参数对此很重要,然后必须在程序中实现相应的小步骤。
第一个问题是在使用loadonce: true
选项的情况下从服务器重新加载数据。您目前使用代码
$grid.jqGrid('setGridParam', {datatype: 'json'}).trigger('reloadGrid');
但是免费的jqGrid允许执行
$grid.trigger('reloadGrid', {fromServer: true});
可替换地。免费jqGrid在内部datatype
选项中保存原始dataTypeOrg
值(" json"," jsonp"," xml"依此类推)如果使用选项datatype
,它会从dataTypeOrg
恢复fromServer: true
。了解本地过滤只不过是重新加载具有datatype: 'local'
的网格,这一点非常重要。因此,如果想要使用强大的本地排序和过滤,那么不应在所有重新加载上使用 fromServer: true
(永久不应使用reloadGridOptions: { fromServer: true }
)从服务器加载的数据。
第二个问题是过滤从服务器返回的数据数据将在jqGrid中显示。在旧的jqGrid中它是不可能的,但是免费的jqGrid有选项forceClientSorting: true
,它可以做得很好。该选项的名称并不好,但我不想因为它的使用而改变它。选项强制本地排序和过滤数据 之前从服务器加载的数据的第一页将显示在网格中。
下一个问题是使用过滤器中的数据填充过滤器工具栏,包括显示过滤器操作(如果使用searchOperators: true
选项filterToolbar
)。默认情况下激活的选项loadFilterDefaults: true
可以执行此操作。它是一个额外的免费jqGrid选项,在旧的jqGrid中不存在。结果像
postData: {
filters: JSON.stringify({
groupOp: "AND",
groups: [],
rules: [
{field: "ship_via", op: "ne", data: "FedEx"},
{field: "closed", op: "eq", data: true},
{field: "name", op: "bw", data: "test"}
]
})
},
search: true,
forceClientSorting: true
https://jsfiddle.net/OlegKi/hvwn1tf7/3/中使用的做了所有需要的事情。
接下来要考虑的事情主要是保存/恢复postData.filters
并设置search: true
如果想要应用过滤器,但是它可以理解一切是如何工作的,那么就可以了很容易实现所需的行为。