jqGrid beforeProcessing 停止加载和 ReloadGrid
jqGrid beforeProcessing stop loading and ReloadGrid
这是我的例子:enter link description here
如何自动重新加载?
beforeProcessing: function (data, status, xhr) {
if (data.rows === '') {
$('#jqGridPreparate').jqGrid('clearGridData');
return false;
}
if (data.inputCol) {
$("td.ui-search-input input#id_prep").val('');
$("td.ui-search-input input#id_opisanie").val(data.inputCol);
var rplc = $.parseJSON($("#jqGridPreparate")[0].p.postData.filters);
for (var i=0; i < rplc.rules.length; i++) {
if (rplc.rules[i].field === 'prep') {
rplc.rules[i].field = 'opisanie';
}
}
$.extend($("#jqGridPreparate")[0].p.postData,{filters:JSON.stringify(rplc)});
$("#jqGridPreparate")[0].triggerToolbar(); // not WORK
}
}
我不确定我是否完全理解您要实施的内容。我可以猜想,如果某些附加信息将从服务器 return 编辑,您想要应用过滤器。
看来您在 jqGrid 和服务器之间实现了一些关于 returned 数据的自定义协议。 rows
服务器响应的一部分应该是项目数组。在您的情况下,服务器可以将空字符串设置为 rows
的值。您尝试使用服务器响应的 inputCol
属性 来强制过滤 先前加载的数据 。您对 现有 过滤器进行了一些自定义修改,填充了过滤器工具栏的一些字段,最后您尝试使用 triggerToolbar
。代码非常不清楚,它包含许多您没有直接描述的假设。我不清楚你是想开始 local 过滤还是 jqGrid 应该使用修改后的过滤器向服务器发送新请求。
无论如何,如果你想在其他回调函数中启动某种reloading/filtering,你应该考虑一些基本规则。首先,方法 triggerToolbar
或触发 reloadGrid
工作 同步 。意思是jqGrid先做triggerToolbar
,再做reloadGrid
,直到结束,然后执行$("#jqGridPreparate")[0].triggerToolbar();
之后的下一行代码。因此,强烈建议将 triggerToolbar
或 reloadGrid
的所有调用放在 setTimeout
主体内。它允许处理当前回调直到结束,然后才进行重新加载。如果来自服务器的响应包含您的自定义信息而不是典型的 jqGrid 数据,那么您应该从 beforeProcessing
return false
停止标准处理。
如果你可以构建postData.filters
那么你就不需要使用triggerToolbar
来应用过滤器。取而代之的是,您只需要另外设置 jqGrid 的 search: true
参数,然后触发 reloadGrid
.
对应的代码大概如下:
beforeProcessing: function (data, status, xhr) {
var $self = $(this), p = $self.jqGrid("getGridParam");
if (data.rows === "") {
$self.jqGrid("clearGridData");
return false; // don't process the data by jqGrid
}
if (data.inputCol) {
var i, rplc = $.parseJSON(p.postData.filters);
for (i = 0; i < rplc.rules.length; i++) {
if (rplc.rules[i].field === "prep") {
rplc.rules[i].field = "opisanie";
}
}
p.postData.filters = JSON.stringify(rplc);
setTimeout(function () {
// apply the filter
p.search = true;
$self.trigger("reloadGrid", [{page: 1}]);
}, 50);
return false; // don't process the data by jqGrid
}
}
这是我的例子:enter link description here
如何自动重新加载?
beforeProcessing: function (data, status, xhr) {
if (data.rows === '') {
$('#jqGridPreparate').jqGrid('clearGridData');
return false;
}
if (data.inputCol) {
$("td.ui-search-input input#id_prep").val('');
$("td.ui-search-input input#id_opisanie").val(data.inputCol);
var rplc = $.parseJSON($("#jqGridPreparate")[0].p.postData.filters);
for (var i=0; i < rplc.rules.length; i++) {
if (rplc.rules[i].field === 'prep') {
rplc.rules[i].field = 'opisanie';
}
}
$.extend($("#jqGridPreparate")[0].p.postData,{filters:JSON.stringify(rplc)});
$("#jqGridPreparate")[0].triggerToolbar(); // not WORK
}
}
我不确定我是否完全理解您要实施的内容。我可以猜想,如果某些附加信息将从服务器 return 编辑,您想要应用过滤器。
看来您在 jqGrid 和服务器之间实现了一些关于 returned 数据的自定义协议。 rows
服务器响应的一部分应该是项目数组。在您的情况下,服务器可以将空字符串设置为 rows
的值。您尝试使用服务器响应的 inputCol
属性 来强制过滤 先前加载的数据 。您对 现有 过滤器进行了一些自定义修改,填充了过滤器工具栏的一些字段,最后您尝试使用 triggerToolbar
。代码非常不清楚,它包含许多您没有直接描述的假设。我不清楚你是想开始 local 过滤还是 jqGrid 应该使用修改后的过滤器向服务器发送新请求。
无论如何,如果你想在其他回调函数中启动某种reloading/filtering,你应该考虑一些基本规则。首先,方法 triggerToolbar
或触发 reloadGrid
工作 同步 。意思是jqGrid先做triggerToolbar
,再做reloadGrid
,直到结束,然后执行$("#jqGridPreparate")[0].triggerToolbar();
之后的下一行代码。因此,强烈建议将 triggerToolbar
或 reloadGrid
的所有调用放在 setTimeout
主体内。它允许处理当前回调直到结束,然后才进行重新加载。如果来自服务器的响应包含您的自定义信息而不是典型的 jqGrid 数据,那么您应该从 beforeProcessing
return false
停止标准处理。
如果你可以构建postData.filters
那么你就不需要使用triggerToolbar
来应用过滤器。取而代之的是,您只需要另外设置 jqGrid 的 search: true
参数,然后触发 reloadGrid
.
对应的代码大概如下:
beforeProcessing: function (data, status, xhr) {
var $self = $(this), p = $self.jqGrid("getGridParam");
if (data.rows === "") {
$self.jqGrid("clearGridData");
return false; // don't process the data by jqGrid
}
if (data.inputCol) {
var i, rplc = $.parseJSON(p.postData.filters);
for (i = 0; i < rplc.rules.length; i++) {
if (rplc.rules[i].field === "prep") {
rplc.rules[i].field = "opisanie";
}
}
p.postData.filters = JSON.stringify(rplc);
setTimeout(function () {
// apply the filter
p.search = true;
$self.trigger("reloadGrid", [{page: 1}]);
}, 50);
return false; // don't process the data by jqGrid
}
}