2010-07-18 4 views
27

मुझे वर्तमान में नए पैरामीटर के साथ एक जेसन स्टोर को पुनः लोड करने में परेशानी हो रही है।नए पैरामीटर के साथ एक जेसन स्टोर को फिर से लोड करना ExtJs Ext.data.JsonStore

newsletters = new Ext.data.JsonStore({ 
     url: '/newsletters/', 
     root: 'results', 
     fields: [ 
      'id', 
      'body' 
      'recipients' 
     ], 
     baseParams: { command: 'json', to: dateTo, from: dateFrom }, 
    autoLoad: true 
    }); 

dateTo और dateFrom initally रिक्त स्ट्रिंग ('') और फ़ायरबग में जाँच/समाचार पत्र हैं सही मापदंडों के साथ कहा जाता है: यहाँ मेरी दुकान है।

अब निम्नलिखित techniquest से कोई कार्य नहीं:

dateTo और dateFrom के मूल्यों को बदलने से तो newsletters.reload बुला() अभी भी करने के लिए और रिक्त स्ट्रिंग होने से मानकों के साथ पेज कहता है।

कॉलिंग newsletters.reload({ to: 'test1', from: 'test2' }); अभी भी पैरामीटर को खाली तारों के रूप में देखता है।

अंत में हाथ से काम के रूप में मैं कोशिश की है:

lastOptions = newsletters.lastOptions; 
Ext.apply(lastOptions.params, { 
    to: 'test1', 
    from: 'test2' 
}); 
newsletters.reload(lastOptions); 

यह फिर से अनुरोध नहीं करता/अपडेट किए गए पैरामीटर के साथ समाचार पत्र।

कोई सलाह की सराहना की!

+0

मैं अगर यह महत्वपूर्ण है या नहीं पता नहीं है .. लेकिन आप एक ', याद किया' ' 'fields' – Lipis

उत्तर

5

डॉक्स से, आप शायद कर सकते हैं:

store.setBaseParam('to', dateTo); 

अब, अगर मैं सही ढंग से समझ, आप चाहते हैं कि जब भी dateTo और dateFrom बदल रहे हैं अपने baseParams परिवर्तित करने की।

आप की कोशिश कर सकते:

var dateTo = '', dateFrom = ''; 

store.on('beforeload', function(s) { 
    s.setBaseParam('to', dateTo); 
    s.setBaseParam('from', dateFrom); 
}); 

// This should work : 
dateTo = 1; 
dateFrom = 2; 
store.load(); 
29

आप वास्तव में विधि लोड()

newsletters.load({ 
    params: {to: 'test1', from: 'test2'} 
}) 
+0

+1 में body'', जवाब के लिए के बाद' । –

4

मेरे समस्या थी करने के लिए पैरामीटर वस्तु पारित कर सकते हैं: मैं एक दुकान है कि करने के लिए प्रॉक्सी से अधिक डेटा का अनुरोध करेगा है बैक-एंड। इस अनुरोध में filter नामक पैरामीटर होगा, जो यह तय करने के लिए बैक-एंड की सहायता करेगा कि क्लाइंट में रुचि रखने वाले परिणाम का सेट कौन सा है। यह पैरामीटर Combobox या कुछ अन्य घटक से लोड किया गया है जो उपयोगकर्ता फ़िल्टर करने के लिए उपयोग कर सकते हैं इस्तेमाल किया जाएगा।

मेरे दृष्टिकोण से पैरामीटर को स्टोर पर सेट नहीं किया जाना चाहिए और न ही लोड पैरामीटर का उपयोग करना चाहिए। मैं समझाऊंगा कि क्यों:

  1. स्टोर में पैरामीटर को कॉन्फ़िगर करने से यह संकेत मिलेगा कि एक ही स्टोर का उपयोग करने वाले प्रत्येक अन्य घटक में यह पैरामीटर कॉन्फ़िगर किया जाएगा, जिसका अर्थ है कि आपको सहमतिएं हो सकती हैं।
  2. और दूसरे मामले में, यह लोड विधि पर कॉन्फ़िगर करने योग्य नहीं है, क्योंकि आप प्रत्येक बार स्पष्ट रूप से load विधि का उपयोग अपने आप से नहीं करना चाहते हैं, याद रखें कि पहले से ही कुछ घटक जैसे पेजिंग हैं और कस्टम घटक जो इस विधि को ट्रिगर करते हैं।

देखने की मेरी बात से सही तरीका होगा क्या:

हर बार है कि एक load शुरू हो रहा है, हम बस एक गैर दखल तरह से अतिरिक्त पैरामीटर जोड़ देती है।इसका मतलब है कि ट्रिगर को कोई बदलाव करने की आवश्यकता नहीं होगी (याद रखें कि ट्रिगर store.load() निष्पादित करने वाला कोई भी घटक हो सकता है) और स्टोर इस नए पैरामीटर के बारे में अवगत नहीं होगा।

आप यहां स्पष्ट रूप से देख सकते हैं कि यह डेटा प्रॉक्सी से अनुरोध करने से पहले एक ऑपरेशन किया जाएगा, और मेरे मामले में मैंने beforeload ईवेंट के लिए श्रोता के रूप में लागू किया था। जब beforeload निष्पादित किया जाता है, तो मैं श्रोता के ऑपरेशन पैरामीटर में नए पैरामीटर को जोड़ता हूं कि documentation के अनुसार: beforeload(store, operation, eOpts) है। अंतिम कार्यान्वयन कुछ की तरह है:

store.on({ 
    beforeload: function (store, operation, opts) { 
     Ext.apply(operation, { 
      params: { 
       filterName: Ext.getCmp('filterCombo').getValue() 
      } 
     }); 
    } 
}); 
संबंधित मुद्दे