Добавление функции в плагин jqGrid jQuery - PullRequest
6 голосов
/ 17 июня 2011

Я пытаюсь добавить функцию с именем rows в плагин jqGrid jQuery, но не могу определить синтаксис. Вот мои нерабочие версии.

(function($) {
 $.fn.jgrid.rows = function(data) {
   // do something
 };
});

(function($) {
 $.fn.rows = function(data) {
   // do something
 };
});

 $.jqgrid.fn.rows = function(data) {
   // do something
 };

 $.fn.rows = function(data) {
   // do something
 };

Какой будет правильный синтаксис?

Спасибо!

Ответы [ 2 ]

13 голосов
/ 17 июня 2011

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

Прежде всего, jqGrid - это плагин jQuery, и если вы напишите, например,

$(myselector).jqGrid('setSelection',rowid);

, это может быть$(myselector) выбирает больше как один элемент DOM .Например,

$('table').jqGrid('setSelection',rowid);

попытается вызвать метод jqGrid 'setSelection' для всех <table> элементов на странице.Поэтому элемент this в массиве элементов DOM (это должно быть <table> элементов DOM), а не только один элемент.

Еще одно общее замечание.Существуют методы jQuery, которые можно объединить в цепочку, например

$("#list").jqGrid('setGridParam',{datatype:'json'}).trigger('reloadGrid');

. В случае 'setGridParam' что-то делает и возвращает this для поддержки связывания.Другие методы не поддерживают цепочку и возвращают то, что метод должен вернуть.Например, getDataIDs возвращает массив идентификаторов, и нельзя getDataIDs связывать с другими методами jQuery.

Теперь я вернусь к вашему вопросу.Я бы лучше назвал новый метод getRowsById.Метод вернет массив с элементами DOM, которые представляют <tr> (строка таблицы).Метод будет иметь rowid в качестве параметра.Затем можно расширить jqGrid новым методом следующим образом:

$.jgrid.extend({
    getRowsById: function (rowid){
        var totalRows = [];
        // enum all elements of the jQuery object
        this.each(function(){
            if (!this.grid) { return; }
                // this is the DOM of the table
                // we
                var tr = this.rows.namedItem(rowid);
                if (tr !== null) { // or if (tr !== null)
                    totalRows.push(tr);
                }
        });
        return totalRows;
    }
});

Прежде всего я использую в примере метод $.jgrid.extend, определенный здесь .Это в основном $.extend($.fn.jqGrid,methods);.Затем, поскольку метод, который мы реализуем, не может быть связан, мы определяем переменную totalRows, которая будет возвращена позже как результат метода.Теперь нам нужно перечислить все объекты из this (например, элементы $(myselector) или $('table') в приведенных выше примерах).Мы делаем это в отношении this.each(function(){/*do here*/}); конструкции.Затем внутри цикла мы делаем следующее:

if (!this.grid) { return; }

С помощью оператора мы проверяем, имеет ли текущий элемент DOM свойство grid.Это не стандартное свойство элемента table, но jqGrid расширяет DOM-элементы table свойством.С помощью теста мы могли бы пропустить, например, другие элементы table, где jqGrid не применяются (которые не являются jqGrid).Затем я использую тот факт, что this должен быть DOM элемента table, который имеет свойство rows (см. здесь и здесь ), и я использую его namedItemметод.Встроенный метод работает лучше как $ ("#" + rowid), но делает то же самое.Ведь мы возвращаем массив totalRows.У него не будет элемента, если строка с идентификатором строки отсутствует в сетке, и 1, если она существует.Если текущий селектор jQuery выбрал больше как одну сетку, и у нас была ошибка, и мы включили в обе строки сетки с одним и тем же идентификатором, возвращаемый массив будет иметь длину больше 1. Таким образом, мы можем использовать его так:

var grid = $("#list");
var tr = grid.jqGrid('getRowById','1111');
alert(tr.length);

В конце хочу отметить, что метод $.jgrid.extend может быть полезен не только в том случае, если вы хотите ввести новый метод jqGrid. Иногда уже есть какой-то метод jqGrid, но он не совсем то, что вам нужно .Итак, вы хотите, чтобы модифицированный метод делал что-то в начале или что-то в конце исходного метода jqGrid.В этом случае мы можем сделать следующее

var oldEditCell = $.fn.jqGrid.editCell;
$.jgrid.extend({
    editCell: function (iRow,iCol, ed){
        var ret;
        // do someting before
        ret = oldEditCell.call (this, iRow, iCol, ed);
        // do something after
        return ret; // return original or modified results
    }
});

. В этом примере мы перезаписываем оригинальный метод editCell с, который будет вызываться самой jqGrid и что-то делать перед чем-то после вызова.

2 голосов
/ 17 июня 2011

попробуй:

$.extend($.jgrid,{
    rows: function() {
        // do something
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...