В своем предыдущем вопросе вы написали, что используете WCF на стороне сервера. В случае вам не нужно использовать datatype
как функцию . Вместо этого вы можете просто использовать следующие параметры:
datatype: "json",
ajaxGridOptions: { contentType: "application/json" },
serializeGridData: function (data) {
return JSON.stringify(data);
}
Чтобы быть уверенным, что JSON.stringify
поддерживается в старых веб-браузерах, вы должны включить json2.js
, который вы можете загрузить из здесь .
В старом ответе вы можете найти больше примеров кода (и загрузить демоверсию), где показано, как вы можете использовать WCF с jqGrid.
Теперь я отвечу на ваш оригинальный вопрос: «Почему loadComplete
не срабатывает», если вы используете datatype
в качестве функции. Краткий ответ: если вы используете datatype
в качестве функции , ваш код отвечает за вызов loadComplete
.
Если вы используете datatype
в качестве функции , ваш код отвечает за некоторые вещи, которые обычно делает jqGrid. Итак, прежде всего вы должны понять, что должна делать функция datatype
. Пример из документации (см. здесь ) показывает простейшую, но не полную реализацию datatype
как функции. Более полный пример кода выглядит следующим образом:
$("#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
});
Вы видите, что код не такой короткий. В приведенном выше примере мы все еще не поддерживаем некоторые параметры jqGrid, такие как виртуальная прокрутка (scroll: 1
или scroll: true
).
Тем не менее, я надеюсь, что теперь я очистил , почему Я не рекомендую использовать datatype
в качестве функции. Если вы используете его, вы должны понимать многие вещи , как внутренне работает jqGrid . Вы должны проверить его исходный код, чтобы убедиться, что вы все делаете правильно. Если вы что-то пропустите, ваш код будет работать некорректно в некоторых ситуациях или в некоторой комбинации параметров jqGrid.
Если вы посмотрите на код, который я включил в начале моего ответа (использование ajaxGridOptions
и serializeGridData
), вы увидите, что код очень прост. Более того, работает со всеми другими допустимыми комбинациями параметров jqGrid . Например, вы можете использовать loadonce: true
, loadComplete
, loadError
или даже виртуальную прокрутку (scroll: 1
или scroll: true
). Все необходимое зависит от параметров , сделайте для вас jqGrid .