free-jqGrid (4.15.4)、服务器过滤器、客户端排序和分页?
free-jqGrid (4.15.4), server filter, client sorting and paging?
正在尝试从基于 multisearch/filters 的服务器加载数据,但在客户端进行排序和分页。我发现一些帖子说只需将数据类型设置回 beforeSearch
方法中的原始值。
我已经尝试过了,它确实对服务器执行并且 return 正确的数据。然而,我第二次过滤它似乎是从服务器获取数据,但随后它在下面显示的 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
。但上面没有定义。
如果我对你的问题理解正确,那么你应该结合使用 forceClientSorting: true
和 loadonce: true
。它强制从服务器加载的数据将在从服务器加载后直接本地排序、过滤和分页。因此,您可以删除当前使用的 loadComplete
。有关演示,请参阅 the answer。
此外,您可以添加 searching
属性,其中包括 filterToolbar
和 searchGrid
的所有选项:
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
从服务器返回的数据 本地 过滤
正在尝试从基于 multisearch/filters 的服务器加载数据,但在客户端进行排序和分页。我发现一些帖子说只需将数据类型设置回 beforeSearch
方法中的原始值。
我已经尝试过了,它确实对服务器执行并且 return 正确的数据。然而,我第二次过滤它似乎是从服务器获取数据,但随后它在下面显示的 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
。但上面没有定义。
如果我对你的问题理解正确,那么你应该结合使用 forceClientSorting: true
和 loadonce: true
。它强制从服务器加载的数据将在从服务器加载后直接本地排序、过滤和分页。因此,您可以删除当前使用的 loadComplete
。有关演示,请参阅 the answer。
此外,您可以添加 searching
属性,其中包括 filterToolbar
和 searchGrid
的所有选项:
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
从服务器返回的数据 本地 过滤