Кажется, правильный ответ на ваш вопрос мало зависит от того, что должен делать метод 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 и что-то делать перед чем-то после вызова.