How to wait until all stores are loaded in ExtJs?
Extend the store - add the 'loaded' property to the child class, override 'initComponent()' and attach to 'load' event inside it, raise the 'loaded' to true inside the event handler, add the 'isLoaded()' method returning value of the 'loaded' property.
Other way, if you use http transport - store.proxy.conn.isLoading()
Take a look at this
Using timeouts isn't a great solution, however also having to rely on everything in the store manager isn't great either.
I'd do something like:
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
}
If you're using it alot you could even turn it into a class.
Use the store.isLoading()
method, I think that is what it is for. I use it and it works fine.
Configure the stores that you want to be loaded before performing some logic with a
storeId
config.Put these
storeIds
into an array.Whenever one of these stores is loaded iterate through the array, lookup the store with
Ext.getStore
and callisLoading
on it.If none of the stores in the array are still loading, perform your logic.
For example, say I want store1
and store2
loaded before I perform some logic (I am showing this in non-MVC pattern because it looks like you are not using MVC pattern from your snippet).
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
}
}