2012-06-12 18 views
29

मेरे पास कॉम्बो बॉक्स का एक सेट है जो पांच स्टोर्स द्वारा संचालित होता है और सभी स्टोर्स पूरी तरह लोड होने के बाद मैं एक फ़ंक्शन को आग लगाना चाहता हूं। ऐसा करने का अनुशंसित तरीका क्या है? मैं कुछ इस तरह कर सकता है, लेकिन यह kludgy लगता है:एक्स्टजेस में सभी स्टोर लोड होने तक प्रतीक्षा कैसे करें?

var store1Loaded = false; 
var store2Loaded = false; 

store1.on('load', function(){ 
    store1Loaded = true; 
}); 

store2.on('load', function(){ 
    store1Loaded = true; 
}); 


store1.load(); 
store2.load(); 

function WaitForFunction() 
{ 
    if (!store1Loaded || !store2Loaded)) { 
     setTimeout(WaitForFunction, 100); 
     return; 
    } 
    AllStoresLoaded(); 
} 

function AllStoresLoaded(){ 
     //Do Something 
} 

उत्तर

22

store.isLoading() विधि का उपयोग करें, मुझे लगता है कि यह वही है। मैं इसका इस्तेमाल करता हूं और यह ठीक काम करता है।

  1. कॉन्फ़िगर भंडार है कि आप चाहते हैं एक storeId config साथ कुछ तर्क प्रदर्शन से पहले लोड करने के लिए।

  2. इन storeIds को एक सरणी में रखें।

  3. जब भी इनमें से एक स्टोर सरणी के माध्यम से फिर से लोड हो जाता है, तो स्टोर को Ext.getStore के साथ लुकअप करें और isLoading पर कॉल करें।

  4. यदि सरणी में कोई भी स्टोर अभी भी लोड नहीं हो रहा है, तो अपना तर्क करें।

उदाहरण के लिए, मैं store1 और store2 लोड करने से पहले मैं कुछ तर्क (मैं गैर MVC पैटर्न में इस दिखा रहा है क्योंकि ऐसा लगता है कि आप अपने टुकड़ा से MVC पैटर्न उपयोग नहीं कर रहे) प्रदर्शन चाहते हैं।

var store1 = Ext.create('Ext.data.Store', { 
    model: myModel, 
    storeId: 'store1', // store needs to be done MVC style or have this config 
    proxy: { 
     type: 'ajax', 
     url: 'url...', 
     reader: 'json' 
    }, 
    autoLoad: { 
     callback: initData // do this function when it loads 
    } 
}); 

var store2 = Ext.create('Ext.data.Store', { 
    model: myModel, 
    storeId: 'store2', 
    proxy: { 
     type: 'ajax', 
     url: 'url...', 
     reader: 'json' 
    }, 
    autoLoad: { 
     callback: initData // do this function when it loads 
    } 
}); 

// the stores to be checked 
var myComboStores = ['store1', 'store2'] 

// function does logic if they are both finished loading 
function initData() { 
    var loaded = true; 
    Ext.each(myComboStores, function(storeId) { 
     var store = Ext.getStore(storeId); 
     if (store.isLoading()) { 
      loaded = false; 
     } 
    }); 
    if(loaded) { 
     // do stuff with the data 
    } 
} 
+0

करता है 'isLoading()' बराबर 'FALSE' जब दुकान लोड नहीं है? क्या यह एक समस्या हो सकती है? –

+0

@o_nix "लोड नहीं हुआ" क्या आपका मतलब है "कोई रिकॉर्ड नहीं है"? मेरे अनुभव में 'isLoading' केवल सर्वर से अनुरोध और प्रतिक्रिया के बीच में सही है। तो यदि कोई सर्वर कोई रिकॉर्ड नहीं देता है तो यह अभी भी सत्य होगा। यह मेरे लिए कभी भी एक समस्या नहीं रही है। मेरे लिए इसका मुख्य बिंदु यह जानना है कि अनुरोध कब वापस आता है। यदि आप बिना किसी परिणाम के प्रतिक्रिया को संभालना चाहते हैं तो विभिन्न तर्क लागू किए जा सकते हैं। – Geronimo

+1

शायद जांच रखने के लिए setTimeout (me.initData, 500) काम करना चाहिए। – VAAA

2

दुकान का विस्तार - बच्चे कक्षा में 'लोड' प्रॉपर्टी जोड़ते हैं, ओवरराइड 'initComponent()' और 'लोड' घटना के अंदर करने के लिए देते हैं यह ईवेंट हैंडलर के अंदर 'लोड' को बढ़ाएं, 'लोडेड' संपत्ति के 'isLoaded()' विधि वापसी मूल्य जोड़ें।

अन्य तरह से, यदि आप http परिवहन का उपयोग -

store.proxy.conn.isLoading() this

2
function storeLoadingHandler(justLoadedStore) { 
    // I use some quick hacky flag, you can do it by your own way 
    justLoadedStore.loaded = true; 

    var allStoresLoaded = true; 

    // just walk through all stores registered in the application 
    // do not forget to use MVC-style stores or add 'storeId' manually 
    // or register every store with your custom code 
    Ext.StoreManager.each(function(existingStore) { 
     // we have to ignore system stores 
     if (existingStore.storeId != 'ext-empty-store') { 
      if (!existingStore.loaded) { // our flag or undefined 
       // nope, at least one of stores is not loaded 
       allStoresLoaded = false; 

       return false 
      } 
     } 
    }) 

    if (allStoresLoaded) // then do something 
     alert('All stores are loaded.'); 
} 

// add the loading handler for all stores 
Ext.StoreManager.each(function() { 
    this.on('load', storeLoadingHandler); 
}) 
6

का उपयोग करते हुए समय समाप्ति पर एक नजर डालें, एक महान समाधान नहीं है लेकिन स्टोर मैनेजर में सबकुछ पर भरोसा करना भी अच्छा नहीं है। आप इसे तुम भी एक वर्ग में बदल सकता है एक बहुत उपयोग कर रहे हैं

var allStores = [store1, store2], 
    len = allStores.length, 
    loadedStores = 0, 
    i = 0; 

for (; i < len; ++i) { 
    allStores[i].on('load', check, null, {single: true}); 
} 

function check() { 
    if (++loadedStores === len) { 
     AllStoresLoaded(); 
    } 
} 

function AllStoresLoaded() { 
    //Do Something 
} 

:

मैं की तरह कुछ करना चाहते हैं।

2

आप एक समस्या है, तो जब दुकानों को लोड होने में समय लगेगा क्योंकि बता गया प्रदर्शित नहीं होते हैं/ठीक से ताजा कर, समाधान हर दुकान जो इस

की तरह एक combobox में इस्तेमाल किया जा रहा है बनाने के लिए है
Ext.create("Ext.data.Store", { 
    ..., 
    loading: true, 
    ... 
}); 

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

+0

हम सटीक समस्या थी क्योंकि हमारे ViewModel के रूप में 'वापस आ गया था टास्क ' (Asp.Net MVC) और comboboxes async अपने स्टोर लोड होने से पहले अपने मूल्य निर्धारित करने की कोशिश कर रहे थे। 'लोडिंग: सत्य' को सेट करना बिल्कुल समस्या को ठीक करता है। – mdisibio

+0

यह मुझे समय/कोड का एक टन बचाया। हमारे पास एक ही कंबोबॉक्स स्टोर "रेस" हालत है जहां कंबोबॉक्स ने अपनी दुकान लोड करने से पहले फॉर्म बाध्यकारी हो रहा है। मुझे यह थ्रेड लगता है कि मुझे अपने फॉर्म के साथ जारी रखने से पहले सभी स्टोर्स को लोड करने की प्रतीक्षा करने के लिए ग्राहक कोड लिखना होगा। लोडरॉर्डर ऑपरेशंस। इस सरल स्टोर कॉन्फ़िगरेशन ने समस्या को ठीक से ठीक कर दिया। बहुत धन्यवाद! –

1

उपयोग चतुर जे एस

चतुर जे एस एक ऐड-ऑन dependancy इंजेक्शन के माध्यम से इंजेक्शन है। यह उपयोगकर्ता को AJAX कॉल में वादे जोड़ने की अनुमति देता है और कॉल केवल तभी हल किया जाता है जब कॉल किया जाता है। Link for Deft JSExt.defer.All() का उपयोग करें; आपके सभी 5 स्टोर लोड करने के लिए और एक विशेष कॉलबैक फ़ंक्शन को सभी स्टोर लोड होने के बाद बुलाया जाएगा। उस समारोह में, अपने तर्क को लागू करें।

1

ExtJs स्टोर में विधि load और लोड विधि में कॉलबैक फ़ंक्शन है।

मैं एक डेमो बनाया है। आप यहां देख सकते हैं Sencha fiddle

यह फ़ंक्शन स्टोर और वापसी करेगा।

function createStore(id) { 
    return Ext.create('Ext.data.Store', { 
     storeId: 'store_' + id, 
     alias: 'store.store_' + id, 
     proxy: { 
      type: 'ajax', 
      url: 'data.json', 
      timeout: 300000, 
      reader: { 
       type: 'json', 
       rootProperty: 'data' 
      } 
     } 
    }); 
} 

उदाहरण के लिए मैं दुकान की सरणी है। इसमें storeId या उपनाम शामिल हैं।

var storeArry = [], 
    store = ''; 

for (var key = 0; key < 5; key++) { 
    storeArry.push(createStore(key).storeId); 
} 

हर दुकान कॉलबैक हम storeArray से डेटा हटाने या जाँच के लिए एक चर बनाए रख सकते हैं पर।

Ext.getBody().mask('Please wait..'); 
Ext.defer(function() { 
    Ext.getBody().unmask(); 
    Ext.Array.forEach(storeArry, function (storeId) { 
     //For checking store is created or not 
     //if store is not created we can create dyanamically using passing storeId/alias 
     store = Ext.getStore(storeId); 
     if (Ext.isDefined(store) == false) { 
      store = Ext.create(storeId); 
     } 
     store.load({ 
      callback: function() { 
       //On every store call back we can remove data from storeArray or maintain a veribale for checking. 
       Ext.Array.remove(storeArry, this.storeId); 
       if (storeArry.length == 0) { 
        Ext.Msg.alert('Success', 'All stored is loaded..!'); 
       } 
      } 
     }); 
    }); 
}, 3000); 
संबंधित मुद्दे