2011-06-17 12 views
6

Próbuję dodać funkcję o nazwie rows do wtyczki jqGrid jQuery, ale nie mogę określić składni. Oto moje niedziałające wersje.Dodawanie funkcji do wtyczki 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 
}; 

Jaka byłaby prawidłowa składnia?

Dzięki!

Odpowiedz

13

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.

2

try:

$.extend($.jgrid,{ 
    rows: function() { 
     // do something 
    } 
}); 
Powiązane problemy