JQGrid: loadComplete НЕ запускается, когда тип данных: функция - PullRequest
0 голосов
/ 17 сентября 2011

Если я вызываю функцию для загрузки моих данных сетки, loadComplete не срабатывает. Мне нужно обработать это событие, чтобы я мог корректно обновить флажок множественного выбора. Если я обновляюсь в gridComplete, мне нужно дважды нажать на флажок, чтобы снять его.

1 Ответ

5 голосов
/ 17 сентября 2011

В своем предыдущем вопросе вы написали, что используете 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 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...