2010-02-10 27 views
7

ExtJS में, जब मैं ग्रिड प्रदर्शित करता हूं तो मैं स्टोर कैसे लोड करूं? मैं स्टोर को केवल तभी लोड करना चाहता हूं जब ग्रिड प्रदर्शित होता है (उपयोगकर्ता ग्रिड दिखाने के लिए बटन पर क्लिक करता है, इसलिए स्टोर को पहले लोड करना अपर्याप्त है)। मैंने afterrender श्रोता की कोशिश की लेकिन यह गलत स्थान पर लोडमास्क प्रस्तुत करता है, और afterlayout श्रोता हर बार ग्रिड का आकार बदलने के बाद ग्रिड को पुनः लोड करता है।ExtJS में, जब मैं ग्रिड प्रदर्शित करता हूं तो मैं स्टोर कैसे लोड करूं?

उत्तर

13

यह उन चीजों में से एक है जो पूरा करने के लिए दर्द का थोड़ा सा हो सकता है क्योंकि ब्राउजर को एक बार में विशेष रूप से करने के लिए बहुत कुछ देना था (विशेष रूप से आईई में ध्यान देने योग्य)।

मैं डिफिगर के संयोजन का उपयोग करना चाहता हूं ताकि ब्राउजर को चीजों को सही तरीके से प्रस्तुत करने के लिए पर्याप्त समय तक ठीक हो सके।

var grid = new Ext.grid.GridPanel({ 
    ..., 
    listeners : { 
     render : function(grid){  
      grid.body.mask('Loading...'); 
      var store = grid.getStore(); 
      store.load.defer(100, store); 
     }, 
     delay: 200 
    } 
}); 

देरी/स्थगित करने के मूल्य के साथ बजाना आपको वांछित परिणाम देना चाहिए। देरी/स्थगित करने के लिए आपको जिस समय की आवश्यकता होगी, उस पर निर्भर करता है कि आपका ग्रिड कितना जटिल है और ब्राउज़र कितना तेज़ है।

आपके स्टोर के लोड को पूरा होने पर मास्क को हटाना भी याद रखें।

listeners: { 
    load: function(){ 
     yourGrid.body.unmask(); 
    } 
} 

नोट: बस लॉयड द्वारा जवाब देने के लिए कुछ स्पष्टीकरण - आप गलत पर AutoLoad स्थापित करने के लिए है, क्योंकि वह डिफ़ॉल्ट है की जरूरत नहीं है (यानी: यह बिल्कुल निर्धारित नहीं करते हैं) और इसे से की तरह लगता है आपका विवरण है कि आप रीलोड के बजाय स्टोर लोड विधि का उपयोग करना चाहते हैं।

+0

यह एक अच्छा तरीका है, हालांकि अगर आपको लगता है कि आपको वास्तव में इसकी आवश्यकता है तो मैं केवल मास्किंग लागू करूंगा। यदि यह बहुत तेज़ी से लोड हो जाता है तो मास्क एक झिलमिलाहट की तरह लग सकता है। साथ ही, सुनिश्चित करें कि आप स्टोर के लोड इवेंट हैंडलर में अनमास्क करें। लेआउट ब्राउज़र संयोजन उदाहरण "नेस्टेड लेआउट के साथ टैब" इसका उपयोग अपने आंतरिक ग्रिड में स्टोर लोडिंग की रेंडर विधि पर करता है: http://www.extjs.com/deploy/dev/examples/layout-browser/layout-browser.html –

+0

मैं ब्रायन की टिप्पणियों से सहमत हूं - यदि आपका डेटा ~ 5 सेकंड से कम समय में वापस आता है तो ऐसा करने के बारे में भूल जाओ। उपयोगकर्ता इसे कभी नहीं देख पाएगा। मास्क को हटाने के बारे में एक tidbit जोड़ा गया, धन्यवाद। –

+0

अच्छा एक .. बस आश्चर्य है, 'देरी: 200' का उपयोग क्या है? क्या यह आवश्यक है? – Gugan

0

आप स्टोर के लिए ऑटोलोड को गलत पर सेट कर सकते हैं और बस store.reload() को कॉल कर सकते हैं; जब उपयोगकर्ता ग्रिड दिखाने के लिए बटन पर क्लिक करता है।

+2

यह काम करता है, लेकिन फिर इसका मतलब है कि ग्रिड अपने स्टोर के लिए ज़िम्मेदार नहीं है। यह ठीक है अगर आप कई घटकों में एक स्टोर साझा कर रहे हैं, लेकिन एक ग्रिड के लिए, मुझे स्टोर लोडिंग के लिए ग्रिड जिम्मेदार होना चाहिए। –

2

क्या आपने activate ईवेंट को संभालने पर विचार किया है? आप एक ईवेंट हैंडलर जोड़ सकते हैं जो activate ईवेंट पर डेटा लोड करता है और फिर स्वयं को हटा देता है।

this.on('activate', function(){ 
this.un('activate', arguments.callee); 
    this.store.load(); 
}, this); 

यहाँ thisGridPanel को दर्शाता है।

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