Wydaje się, że prawidłowa odpowiedź na pytanie zależy od tego, co trochę powinien zrobić metodę rows
której chcesz wdrożyć. Próbuję trochę zgadnąć i daje implementację, która odpowiada mojemu zrozumieniu twojego pytania.
Przede wszystkim jqGrid jest plugin jQuery i jeśli piszesz na przykład
$(myselector).jqGrid('setSelection',rowid);
może się okazać, że $(myselector)
wybiera bardziej jako jeden element DOM. Na przykład
$('table').jqGrid('setSelection',rowid);
spróbuje zadzwonić jqGrid metoda „setSelection” na wszystkich <table>
elementów na stronie. Tak więc this
element w tablicy elementów DOM (powinien to być element DOM <table>
), a nie tylko jeden element.
Kolejna uwaga ogólna. Istnieją metody jQuery, które mogą być przykuty jak
$("#list").jqGrid('setGridParam',{datatype:'json'}).trigger('reloadGrid');
W przypadku „setGridParam” coś zrobić i powrócić this
wspierać łańcuchowym. Inne metody nie obsługują łączenia i zwracają to, co metoda musi zwrócić. Na przykład getDataIDs
zwraca tablicę identyfikatorów i nie można połączyć łańcuchów getDataIDs
z innymi metodami jQuery.
Teraz wracam do pytania. Lepiej nazwać nową metodę getRowsById
. Metoda zwróci tablicę z elementami DOM, które reprezentują <tr>
(wiersz tabeli). Metoda będzie miała parametr rowid
. Następnie można rozszerzyć jqGrid z nowej metody w sposób:
$.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;
}
});
Przede wszystkim używam na przykład metoda $.jgrid.extend
zdefiniowane here. Ma głównie $.extend($.fn.jqGrid,methods);
. Następnie, ponieważ metoda, którą stosujemy, nie może być powiązana, definiujemy zmienną totalRows
, która zostanie zwrócona później w wyniku zastosowania metody. Teraz musimy wyliczyć wszystkie obiekty z this
(jak elementy $(myselector)
lub $('table')
w powyższych przykładach). Robimy to w odniesieniu do konstruktu this.each(function(){/*do here*/});
. Następnie wewnątrz pętli mamy następujące
if (!this.grid) { return; }
ze stwierdzeniem możemy sprawdzić, czy prąd elementu DOM ma grid
nieruchomości. Nie jest to standardowa właściwość elementu table
, ale jqGrid rozszerza elementy DOM obiektu table
o tę właściwość. W teście możemy pominąć na przykład inne elementy, w których jqGrid
nie są stosowane (które nie są jqGrid).Następnie używam faktu, że this
musi być DOM elementu table
, który ma właściwość rows
(patrz here i here) i używam jej metody namedItem
. Natywna zaimplementowana metoda działa lepiej jako $ ("#" + rowid), ale zrób to samo. W końcu zwracamy tablicę totalRows
. Nie będzie mieć elementu, jeśli wiersz z identyfikatorem wiersza nie znajduje się w siatce, a 1, jeśli istnieje. Jeśli bieżący selektor jQuery wybrać więcej jak jednej siatki i mieliśmy błąd i włączone zarówno siatki wierszy z tym samym identyfikatorem będzie zwrócona tablica ma długość większą jako 1. Tak więc można używać go tak
var grid = $("#list");
var tr = grid.jqGrid('getRowById','1111');
alert(tr.length);
Na na koniec chciałbym wspomnieć, że metoda $.jgrid.extend
może być pomocna nie tylko wtedy, gdy chcemy wprowadzić nową metodę jqGrid. Kiedyś istnieje już metoda jqGrid, ale nie jest to dokładnie to, czego potrzebujesz. Więc chcesz, aby zmodyfikowana metoda zrobiła coś na początku lub coś na końcu oryginalnej metody jqGrid. W przypadku możemy wykonać następujące
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
}
});
W przykładzie zastąpienie oryginalnego editCell
metody przy zostanie wywołana przez samego jqGrid i coś zrobić, zanim coś po wywołaniu.