2011-06-17 61 views
6

我想添加一個函數名爲rows jqGrid jQuery插件,但我不能確定語法。這是我的非工作版本。添加一個函數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 
}; 

什麼是正確的語法?

謝謝!

回答

13

似乎對你的問題的正確答案取決於從什麼應該做,你要實現的方法rows一點。我嘗試猜測一點,並給出與我對你的問題的理解相對應的實現。

所有的jqGrid首先是jQuery插件和如果寫例如

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

它可以是$(myselector)選擇更爲一個DOM元素。例如

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

會嘗試調用的jqGrid方法「爲setSelection」頁面上的所有<table>元素。所以DOM元素數組中的元素(它應該是<table>DOM元素),而不僅僅是一個元素。

另一個一般的評論。有可捆綁,像

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

在這種情況下的「setGridParam做某些事情並返回this支持鏈接jQuery方法。其他方法不支持鏈接並返回該方法需要返回的內容。例如getDataIDs返回一個ID數組,而另一個不能使用另一個jQuery方法鏈接getDataIDs

現在我回到你的問題。我會更好地命名新方法getRowsById。該方法將返回包含表示<tr>(錶行)的DOM元素的數組。該方法將有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定義here所述方法使用的。它主要是$.extend($.fn.jqGrid,methods);。然後,因爲我們實現的方法不能被鏈接,所以我們定義了totalRows變量,這個變量將在後面作爲方法的結果返回。現在我們必須列舉來自this的所有對象(如上例中的$(myselector)$('table')的元素)。我們在this.each(function(){/*do here*/});構造上做到這一點。然後循環內我們就以下

if (!this.grid) { return; } 

隨着我們測試當前的DOM元素是否具有grid屬性的語句。它不是table元素的標準屬性,但jqGrid使用屬性擴展了table的DOM元素。通過測試,我們可以跳過其他table元素,其中jqGrid未應用(不是jqGrid)。然後我使用this必須是具有rows屬性(請參閱herehere)的table元素的DOM,並使用其namedItem方法。本地實現的方法比$(「#」+ rowid)效果更好,但是執行方式相同。畢竟我們返回數組totalRows。如果行ID不在網格中,那麼它將沒有元素,如果它存在,則爲1。如果當前的jQuery選擇更多的選擇爲一個網格,我們有一個錯誤,包括在兩個網格行具有相同id返回的數組將具有更大的長度爲1。因此,我們可以用它使

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

在結束我想提一下,不僅如果你想引入新的jqGrid方法,方法$.jgrid.extend可能會有所幫助。 有時候已經有一些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

嘗試:

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