2011-04-21 12 views
6

ऐसा लगता है कि इस विषय के बारे में यहां कुछ प्रश्न हैं, और उनके पास कुछ अच्छे उत्तर हैं, लेकिन ऐसा लगता है कि मेरा मामला थोड़ा अलग है। मुझे jqGrid में प्रदर्शित रिकॉर्ड्स को फ़िल्टर करने की ज़रूरत है, लेकिन पूरी तरह क्लाइंट-साइड।jqGrid फ़िल्टरिंग रिकॉर्ड्स

कई कारणों से, मेरे ग्रिड को पॉप्युलेट करने के लिए मेरे लिए सबसे अच्छा तरीका एक सरणी है जो सीधे पृष्ठ पर जावास्क्रिप्ट में उत्सर्जित होता है। ग्रिड स्वयं सर्वर से बिल्कुल संपर्क नहीं करता है। मेरे पास कुछ ग्रिड घटनाओं में कुछ कस्टम AJAX हो रहा है, लेकिन यह है। (असल में, मैं इसे उपलब्ध सेवाओं के मौजूदा सेट के साथ एकीकृत कर रहा हूं जो महत्वपूर्ण रूप से परिवर्तित नहीं हो सकता है।)

जो मैं करना चाहता हूं वह एक साधारण पाठ इनपुट और बटन के आधार पर ग्रिड फ़िल्टर करता है। मेरे पृष्ठ में टेक्स्ट इनपुट, बटन और एक टेबल है (जो दस्तावेज़ तैयार पर ग्रिड बन जाती है)। मैं बटन की क्लिक इवेंट (सामान्य jQuery इवेंट बाइंडिंग, कुछ विशेष नहीं) से जुड़ना चाहता हूं और jqGrid पर डिस्प्ले फ़िल्टर के रूप में टेक्स्ट इनपुट से मान का उपयोग करना चाहता हूं।

"फ़िल्टर" द्वारा मेरा मतलब केवल इनपुट में टेक्स्ट के लिए एक मैच (किसी भी क्षेत्र में) वाले रिकॉर्ड प्रदर्शित करना है। फिर, सभी रिकॉर्ड प्रदर्शित करने के लिए, बस इनपुट खाली करें और बटन को फिर से क्लिक करें। इसके अतिरिक्त, ग्रिड बहु-चयन है और चयन को फ़िल्टरिंग के माध्यम से जारी रखने की आवश्यकता है। मुझे बस उन पंक्तियों को छिपाने में सक्षम होना चाहिए जो इनपुट में मेल नहीं खाते हैं।

क्या यह संभव है?

उत्तर

20

स्थानीय ग्रिड को फ़िल्टर करने के लिए आपको केवल filterspostData jqGrid के पैरामीटर को भरना चाहिए और अतिरिक्त search:true सेट करना चाहिए।

ग्रिड के चयन को बचाने के लिए आप अतिरिक्त पैरामीटर [{page:1,current:true}] के साथ reloadGrid का उपयोग कर सकते हैं (here देखें)।

इसी कोड निम्नलिखित

$("#search").click(function() { 
    var searchFiler = $("#filter").val(), grid = $("#list"), f; 

    if (searchFiler.length === 0) { 
     grid[0].p.search = false; 
     $.extend(grid[0].p.postData,{filters:""}); 
    } 
    f = {groupOp:"OR",rules:[]}; 
    f.rules.push({field:"name",op:"cn",data:searchFiler}); 
    f.rules.push({field:"note",op:"cn",data:searchFiler}); 
    grid[0].p.search = true; 
    $.extend(grid[0].p.postData,{filters:JSON.stringify(f)}); 
    grid.trigger("reloadGrid",[{page:1,current:true}]); 
}); 

हो सकता है मैं जो दो कॉलम 'ग्राहक' ('नाम') और 'नोट्स' ('नोट') के लिए फिल्टर आप के लिए the demo बनाया आप कोड का विस्तार कर सकते आपको आवश्यक सभी कॉलम में खोज करने के लिए।

इस पर निर्भर करता है कि आप बचत पंक्ति चयन के साथ वास्तव में क्या मतलब रखते हैं, आपको वर्तमान चयन को selarrrow से एक चर में सहेजने और setSelection विधि के संबंध में चयनित पंक्तियों को पुनर्स्थापित करने की आवश्यकता हो सकती है।

+1

यह बहुत अच्छा लगता है, धन्यवाद! मेरे लिए कुछ अजीब चीजें हो रही हैं। 1: आईई 8 (मेरे प्रोजेक्ट का एकमात्र लक्ष्य ब्राउज़र, क्लाइंट के ऑर्डर) में मेरे क्लाइंट-सप्लाई किए गए पर्यावरण पर यह कहता है कि 'JSON' अपरिभाषित है। लेकिन यह उसी ब्राउज़र में आपके डेमो पर _doesn't_ नहीं कहता है। 2: आपके द्वारा सेट किए गए डेमो में यह फ़िल्टरिंग के बीच पंक्तियों के चयन को सहेज नहीं रहा है। पंक्तियों का चयन किया जाता है, छुपाया जाता है, फिर अनदेखा नहीं किया जाता है। हालांकि, इसे लागू करते समय, मुझे एक ऐसा विचार था जो jqGrid के साथ सरल और अधिक मूल रूप से काम कर सकता है ... – David

+0

क्या होगा, मुख्य ग्रिड को फ़िल्टर करने के बजाय, फ़िल्टर कार्यक्षमता इसके बजाय एक jQuery UI मोडल संवाद (आसान) पॉप अप करता है खुद का ग्रिड जो फ़िल्टर किए गए रिकॉर्ड प्रदर्शित करता है (क्या मैं आसानी से 'ग्रिड 1' से फ़िल्टर किए गए डेटा सेट के साथ 'ग्रिड 2' को पॉप्युलेट कर सकता हूं? मुझे लगता है कि सबसे खराब मामला है कि मैं सरणी की प्रतिलिपि बना रहा हूं और इसे डेटा के रूप में सेट करने से पहले सादे जेएस के साथ लूप में फ़िल्टर करता हूं। grid2')। फिर उपयोगकर्ता जो चाहता है उसे चुनता है और मोडल संवाद बंद करता है। करीब, मुझे 'ग्रिड 2' (आसान) से चयनित आईडी मिलती हैं और उन्हें 'ग्रिड 1' में चयनित के रूप में सेट किया जाता है (आसान, डेमो jqGrid साइट पर है)। और, ज़ाहिर है, 'ग्रिड 2' साफ़ करें। विचार? – David

+1

@ डेविड: आपके पास "JSON' अपरिभाषित है" त्रुटि है क्योंकि आप [json2.js] (https://github.com/douglascrockford/JSON-js) शामिल नहीं हैं। आईई 8 में 'JSON' वर्ग का मूल समर्थन भी है यदि अद्यतन [976662] (http://support.microsoft.com/kb/976662) स्थापित है।मैं आपको यह सुनिश्चित करने के लिए हमेशा json2.js शामिल करता हूं कि 'JSON.stringify' कार्य करें। – Oleg