2011-06-17 12 views
6

पर कोई फ़ंक्शन जोड़ना मैं jqGrid jQuery प्लगइन में 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 
}; 

उचित वाक्यविन्यास क्या होगा?

धन्यवाद!

उत्तर

13

ऐसा लगता है आपके प्रश्न पर सही जवाब क्या विधि rows जो आप लागू करना चाहते हैं क्या करना चाहिए से थोड़ी निर्भर करता है। मैं थोड़ा अनुमान लगाने की कोशिश करता हूं और कार्यान्वयन देता हूं जो आपके प्रश्न की मेरी समझ से मेल खाता है।

सभी jqGrid पहले jQuery प्लगइन है और यदि आप उदाहरण

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

के लिए लिखना यह हो सकता है कि $(myselector) का चयन करता है अधिक के रूप में एक डोम तत्व। उदाहरण

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

के लिए पृष्ठ पर सभी <table> तत्वों पर विधि 'setSelection' jqGrid फोन की कोशिश करेंगे। तो this तत्व डीओएम तत्वों की सरणी में तत्व (यह <table> डीओएम तत्व होना चाहिए) और न केवल एक तत्व होना चाहिए।

एक और सामान्य टिप्पणी। वहाँ jQuery तरीकों की तरह

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

श्रृंखलित किया जा सकता है मामला 'setGridParam' कुछ करना और this लौट श्रृंखलन का समर्थन करने के लिए कर रहे हैं। अन्य विधियां चेनिंग का समर्थन नहीं करती हैं और वापस लौटने की विधि को वापस करने की आवश्यकता होती है। उदाहरण के लिए getDataIDs आईड्स की सरणी देता है और कोई अन्य jQuery विधियों के साथ getDataIDs चेन नहीं कर सकता है।

अब मैं आपके प्रश्न पर वापस लौट आया हूं। मैं बेहतर तरीके से नई विधि getRowsById नाम दूंगा। विधि डीओएम तत्वों के साथ सरणी लौटाएगी जो <tr> (तालिका पंक्ति) का प्रतिनिधित्व करती है। पैरामीटर के रूप में विधि rowid होगी। तो एक तरह से नई विधि के साथ jqGrid विस्तार कर सकते हैं:

सब मैं उदाहरण विधि $.jgrid.extend परिभाषित here में उपयोग की
$.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; 
    } 
}); 

पहले। यह ज्यादातर $.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 नहीं हैं)।फिर मैं इस तथ्य का उपयोग करता हूं कि thistable तत्व का DOM होना चाहिए जिसमें rows संपत्ति है (here, और here देखें) और मैं इसकी namedItem विधि का उपयोग करता हूं। मूल कार्यान्वित विधि $ ("#" + पंक्तिबद्ध) के रूप में बेहतर काम करती है, लेकिन वही करें। आखिरकार हम सरणी totalRows वापस कर देते हैं। यदि पंक्ति आईडी के साथ पंक्ति ग्रिड में नहीं है और यदि यह मौजूद है तो इसमें कोई तत्व नहीं होगा। वर्तमान 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 
    } 
}); 

उदाहरण हम ऊपर लिख jqGrid से ही कहा जाएगा के साथ मूल editCell विधि में करते हैं और कॉल के बाद कुछ के पहले कुछ कर सकते हैं।

2

कोशिश:

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