如果我调用函数来加载我的网格数据,则不会触发loadComplete。我需要处理此事件,以便我可以正确地手动更新多选复选框。如果我在gridComplete中更新,我必须单击两次复选框以取消选中它。
答案 0 :(得分:5)
在上一个问题中,您写道您在服务器端使用WCF。在的情况下,您不需要使用datatype
作为功能。而不是你可以使用以下参数:
datatype: "json",
ajaxGridOptions: { contentType: "application/json" },
serializeGridData: function (data) {
return JSON.stringify(data);
}
为确保旧版网络浏览器支持JSON.stringify
,您应该添加json2.js
,loadComplete
可以从here加载。
在the old answer中,您可以找到更多代码示例(并下载演示),其中显示了如何将WCF与jqGrid一起使用。
现在我将回答您原来的问题:"为什么datatype
不会触发"如果您使用datatype
作为函数。简短的回答是:如果您使用loadComplete
作为功能,则您的代码负责调用datatype
。
如果您使用datatype
作为函数,则代码对jqGrid通常执行的操作负责。首先,你必须了解datatype
函数应该做什么。文档中的一个示例(参见here)显示了$("#list").jqGrid({
url: "example.php",
mtype: "GET",
datatype: function (postdata, loadDivSelector) {
var ts = this, // cache 'this' to use later in the complete callback
p = this.p; // cache the grid parameters
$.ajax({
url: p.url,
type: p.mtype,
dataType: "json",
contentType: "application/json",
data: JSON.stringify(postdata),
cache: p.mtype.toUpperCase() !== "GET",
beforeSend: function (jqXHR) {
// show the loading div
$($.jgrid.jqID(loadDivSelector)).show();
// if loadBeforeSend defined in the jqGrid call it
if ($.isFunction(p.loadBeforeSend)) {
p.loadBeforeSend.call(ts, jqXHR);
}
},
complete: function () {
// hide the loading div
$($.jgrid.jqID(loadDivSelector)).hide();
},
success: function (data, textStatus, jqXHR) {
ts.addJSONData(data);
// call loadComplete
if ($.isFunction(p.loadComplete)) {
p.loadComplete.call(ts, data);
}
// change datatype to "local" to support
// "loadonce: true" or "treeGrid: true" parameters
if (p.loadonce || p.treeGrid) {
p.datatype = "local";
}
},
error: function (jqXHR, textStatus, errorThrown) {
if ($.isFunction(p.loadError)) {
p.loadError.call(ts, jqXHR, textStatus, errorThrown);
}
});
},
... // other parameters
});
作为函数的最简单但不完整的实现。更完整的代码示例如下所示:
scroll: 1
你可以看到代码不是那么短。在上面的示例中,我们仍然不支持某些jqGrid选项,例如虚拟滚动(scroll: true
或datatype
)。
尽管如此,我希望我现在清除为什么我不建议使用ajaxGridOptions
作为功能。如果您使用它,您必须了解很多事情 jqGrid如何在内部工作。您应该检查它的源代码,以确保您正确地执行所有操作。如果您跳过某些事情,那么在某些情况下或在某些jqGrid参数组合中,您的代码将无效。
如果您查看我在答案开头(serializeGridData
和loadonce: true
的用法)中包含的代码,您会发现代码非常简单。此外它适用于jqGrid参数的所有其他合法组合。例如,您可以使用loadComplete
,loadError
,scroll: 1
甚至虚拟滚动(scroll: true
或{{1}})。所需的一切都取决于参数为你做jqGrid 。