Можно ли привязать несколько обработчиков событий к событиям JqGrid без перезаписи предыдущих? - PullRequest
6 голосов
/ 21 июля 2011

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

На некоторых страницах у меня есть дополнительная логика, которую я хотел бы выполнить прив то же время, но если я установлю loadComplete в определении сетки, он перезапишет набор функций в моих значениях по умолчанию.

Есть ли способ связать несколько обработчиков или какой-то другой способ выполнения всего необходимого кода?Заранее спасибо.

Ответы [ 4 ]

8 голосов
/ 21 июля 2011

Я думаю, что вы спрашиваете о важной проблеме, существующей в текущей версии jqGrid. Сейчас сложно реализовать больше как один обработчик событий в jqGrid. Эта проблема не важна для небольших проектов, где вы используете jqGrid, но может быть важна в случае, если вы хотите создать некоторые классы, которые интерпретируют jqGrid. Ваш текущий обходной путь в порядке, но есть ограничение, которое вы понимаете сами. Основная проблема в том, что в пути вы можете реализовать только один более дополнительный loadCompleteEx обработчик.

Я хотел бы предложить вам использование jQuery.trigger или лучше jQuery.triggerHandler . Вы можете использовать его вместе с jQuery.bind и jQuery.unbind . Таким образом, вы можете определить любое количество обработчиков событий, которые работают как стандартные события jQuery.

Например,

var grid = $("#list");

grid.bind('jqGridLoadComplete',function(e,data) {
    alert ("in first jqGridLoadComplete event handler. Called for the page " +
           data.page);
});
grid.jqGrid({
    // jqGrid parameters
    // ...
    loadComplete: function(data) {
        alert("main load complete");
        $(this).triggerHandler("jqGridLoadComplete", data);
    }
});
grid.bind('jqGridLoadComplete.jqGrid',function(e,data) {
    alert ("in second jqGridLoadComplete event handler. Called for the page " +
           data.page);
});

Во втором jQuery.bind я использовал событие пространства имен «jqGridLoadComplete.jqGrid» из пространства имен «jqGrid». Таким образом, вы можете использовать все, что вы знаете (и что вам нужно) о стандартных событиях в jQuery.

См. Соответствующую демонстрацию здесь . Попробуйте переключить страницы в сетке или изменить сортировку на вызов loadComplete.

Я связываю второе jqGridLoadComplete после определения jqGrid. Поскольку в моей демонстрации используется datatype:'local', первый вызов loadComplete будет до выполнения привязки. Таким образом, при первом выполнении loadComplete будет обработан второй обработчик событий jqGridLoadComplete. Поэтому вам лучше связать свой обработчик событий до определения jqGrid. В этом случае вы можете быть уверены, что событие будет вызываться всегда.

ОБНОВЛЕНО: ВАЖНО !!! . Одно не должно вызывать явное jqGridLoadComplete событие внутри loadComplete, если вы используете текущую версию jqGrid. jqGrid сделайте это уже для вас . Приведенный выше код был написан до , соответствующие функции включены в основной код jqGrid. Ответ только что описал основную идею , как несколько обработчиков событий могут быть реализованы в jqGrid. После написания ответа я отправил несколько запросов на получение запросов на триранд с моим предложением реализовать события jQuery в jqGrid. Начиная с версии 4.3.2 (см. здесь ) jqGrid поддерживает события.

0 голосов
/ 08 декабря 2016

Существует гораздо более простое решение, чем я рекомендовал в других местах:

// Set defaults
jQuery.extend(jQuery.jgrid.defaults, {
    loadComplete: function () {
        myCustomFunction();
    }
});

loadComplete: function() {
    // someOtherFunction();
    $.jgrid.defaults.loadComplete(); // Runs myCustomFunction()
},
0 голосов
/ 21 июля 2011

Мое решение для взлома:

// Global Variable in my common.js
var loadCompleteEx;

// set defaults
$.extend($.jgrid.defaults, {
     datatype: 'json',
     height: "100%",
     ...
     loadComplete: function () {
         if ($("#grid").getGridParam("reccount") === 0)
            $("#empty-grid-message").show();
         else
            $("#empty-grid-message").hide();

         // if loadCompleteEx is defined, call it at the end of loadComplete
         if (loadCompleteEx)
             loadCompleteEx();
      }
}

// In my specific page js
loadCompleteEx = function () {
    // Do more stuff after load completes
};

Работает как талисман ... есть ли здесь плохая практика?

0 голосов
/ 21 июля 2011

если вы хотите что-то сделать перед запросом, используйте функцию beforeRequest.

вы также можете привязать функцию к параметру gridComplete.Не могли бы вы привести пример кода, чтобы показать, что вы пытаетесь сделать?

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