2013-02-04 13 views
5

के साथ समस्याएं हैं मेरे पास मेरे वेब पेज पर एक केंडो ग्रिड है और मैं sessionStorage का उपयोग करके ग्रिड फ़िल्टर को प्रोग्रामेटिक रूप से सहेजने की कोशिश कर रहा हूं और यह काम कर रहा है ज्यादातर भाग।केंडो - पृष्ठ पर कोड के माध्यम से ग्रिड फ़िल्टर को बचाने के लिए केवल तारीख फ़िल्टर ग्रिड कॉलम

मेरा मुद्दा यह है कि जब मैं किसी दिनांक कॉलम पर फ़िल्टर डालता हूं, जब मैं उस फ़िल्टर को फिर से लागू करने का प्रयास करता हूं, जब उपयोगकर्ता उस पृष्ठ पर वापस जाता है, तो यह अज्ञात कार्यों में से किसी एक में त्रुटि करता है b/सी toLowerCase() विधि मौजूद नहीं है। यदि मैं स्ट्रिंग कॉलम पर फ़िल्टर कर रहा हूं तो फ़िल्टर ठीक काम करता है। मैं कई फ़िल्टर लागू कर सकता हूं और उन्हें sessionStorage var पर सहेज सकता हूं और ग्रिड पर ठीक से पुनः आवेदन कर सकता हूं। केवल तारीख कॉलम के साथ मुझे समस्याएं हैं।

यह मुझे कुछ समय लिया यह पता लगाने की केन्डो ग्रिड सिंटैक्स का उपयोग फिल्टर पाने के लिए:

var theKgridFilters = $("#gridList").data("kendoGrid").dataSource.filter(); 

फिर एक sessionStorage वर में संग्रहीत करना, मैं stringify() वस्तु पड़ा वरना यह नहीं होगा कि वर में ग्रिड फिल्टर पकड़:

sessionStorage.setItem('theGridFilters', JSON.stringify(theKgridFilters)); 

इसके बाद, ग्रिड पर फिल्टर पुन: लागू करने, मैं स्ट्रिंग एक JSON ऑब्जेक्ट को वापस परिवर्तित करने के लिए बी/सी फिल्टर विशेषताओं के साथ एक वस्तु है, इसलिए मैं प्रयोग किया जाता है यह:

if (sessionStorage.theGridFilters) {        
    gridFilter = sessionStorage.theGridFilters; 
    gridFilter = $.parseJSON(gridFilter); 
} 

कौन सा ग्रिड डेटा स्रोत फिल्टर विशेषता के लिए लागू किया जाता है:

function anonymous(d, __f, __o) { 
    return (d.Last_Modified_Date.toLowerCase() == '2013-01-25t06:00:00.000z') 
} 

कहाँ:

filter: gridFilter, 

जब मैं एक तारीख स्तंभ पर ग्रिड को फिल्टर, त्रुटि नीचे इस लाइन पर फेंकता फ़ील्ड जिसमें फ़िल्टर है Last_Modified_Date है। मैं jQuery, जेएस इत्यादि के साथ काम करने के लिए बिल्कुल नया हूं, और जो मैंने पढ़ा है, से गुमनाम() एफएनएस फ्लाई पर बनाए जाते हैं, इसलिए मुझे विश्वास नहीं है कि मैं इसे बदल सकता हूं।

मैंने ऑनलाइन जांच की और toLowerCase() से पहले toString() फ़ंक्शन जोड़ने का उल्लेख किया गया। मैंने इसे डीबगर में करने की कोशिश की और यह काम किया लेकिन मुझे यकीन नहीं है कि यह परिवर्तन करने के लिए कोड के माध्यम से इसे कैसे पहुंचाया जाए। ऐसा लगता है कि आईई डीबगर के कॉल स्टैक के आधार पर अज्ञात फ़ंक्शन kendo.web.js फ़ाइल से कहा जाता है।

इसके अलावा, डीबगर में तारीख फ़ील्ड का मान नीचे दिखाया गया है:

d.Last_Modified_Date Wed Jan 25 00:00:00 CST 2013 Object, (Date) 

तो मैं भी यकीन है कि अगर यह ऊपर गुमनाम fn है, जिसमें स्ट्रिंग के लिए है कि मूल्य समानता कर सकते हैं नहीं कर रहा हूँ : '2013-01-25t06:00:00.000z'

कृपया मुझे बताएं कि अगर किसी के पास इस तिथि को फ़िल्टर करने के लिए कोई अंतर्दृष्टि है तो समस्या को बचाएं। यह मुझे पागल कर रहा है। हो सकता है कि एक और तरीका है कि मुझे ग्रिड फ़िल्टर को सहेजने के बारे में पता नहीं है।

अग्रिम धन्यवाद, ब्रूस!

+0

कैसे LAST_MODIFIED_DATE 'schema.model' में परिभाषित किया गया है? क्या आपने इसे स्पष्ट रूप से 'दिनांक' के रूप में परिभाषित किया था? – OnaBai

+0

हाय ओनाबाई, हां इसे दिनांक के रूप में परिभाषित किया गया है: Last_Modified_Date: {type: "date", संपादन योग्य: false}, –

+0

मुझे सत्रस्टॉरेज का उपयोग करने का विचार देने के लिए धन्यवाद। – friend

उत्तर

5

कारण आप इस व्यवहार को देख रहे हैं कि JSON.parse जावास्क्रिप्ट दिनांक ऑब्जेक्ट्स नहीं बनाता है। यह इसके बजाय स्ट्रिंग बनाता है:

typeof $.parseJSON(JSON.stringify(new Date())); // "string" 

केंडो यूआई फ्रेमवर्क तब स्ट्रिंग्स के रूप में तारों को फ़िल्टर करने की कोशिश करता है।

वैकल्पिक हल निर्दिष्ट उपयोग करने के लिए है एक reviver:

function dateReviver(key, value) { 
    var a; 
    if (typeof value === 'string') { 
     a = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value); 
     if (a) { 
      return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], 
          +a[5], +a[6])); 
     } 
    } 
    return value; 
} 

gridFilter = JSON.parse(gridFilter, dateReviver); 
+0

वाह, बहुत बहुत धन्यवाद Atanas Korchev !!! मैंने कभी यह नहीं सोचा होगा। इससे पहले कभी एक संशोधक एफएन के बारे में कभी नहीं सुना, तो मुझे निश्चित रूप से पढ़ने की आवश्यकता होगी। साथ ही, ऊपर दिए गए कोड में, यदि मैं $ .parseJSON() के साथ JSON.parse को प्रतिस्थापित करता हूं, तो यह एक ही त्रुटि के लिए त्रुटियों से बाहर निकलता है, लेकिन JSON.parse का उपयोग ठीक काम करता है। मुझे लगता है कि मैंने देखा कि $ .parseJSON() JSON.parse को कॉल करता है, लेकिन किसी भी तरह, मैं बस खुश हूं कि मुझे यह काम करने के लिए मिला। पता लगाने की कोशिश करने के लिए मुझे लगभग 2 दिन लगे। फिर से धन्यवाद, बहुत सराहना की! –

+1

ठीक है, मैं थोड़ा और पढ़ता हूं और JSON.parse() विधि के लिए रिवाइवर एफएन प्राप्त करता हूं। यह आपके डेटा को स्थानांतरित करने में मदद करता है। JSON.parse() विधि के लिए केवल वैकल्पिक संशोधक पैरामीटर है और $ .parseJSON() विधि के लिए नहीं, और यही कारण है कि यह $ .parseJSON() के साथ काम नहीं करता है। http://msdn.microsoft.com/en-us/library/ie/cc836466(v=vs.94).aspx –

+0

यह शानदार चीजें है !!! इसे कभी नहीं समझ सका। तुम दोनों का धन्यवाद! – friend

संबंधित मुद्दे