Comment attendre que tous les magasins soient chargés en ExtJs?

j'ai un ensemble de boîtes combo qui sont pilotées par cinq magasins et je veux tirer une fonction une fois que tous les magasins sont complètement chargés. Quelle est la méthode recommandée pour y parvenir? Je pourrais faire quelque chose comme ça, mais il se sent encombrants:

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
}
30
demandé sur Greg ''Wildman'' Finzer 2012-06-12 23:36:52

7 réponses

store.isLoading() méthode, je pense que c'est ce qu'il est pour. Je l'utilise et il fonctionne très bien.

  1. configurer les magasins que vous voulez charger avant d'effectuer un peu de logique avec un storeId config.

  2. mettez ces storeIds dans un tableau.

  3. chaque fois qu'un de ces magasins est chargé itérate à travers le tableau, cherchez le magasin avec Ext.getStore et appeler isLoading sur il.

  4. si aucun des magasins du tableau ne charge encore, exécutez votre logique.

Par exemple, dire que je veux store1 et store2 chargé avant que j'exécute une certaine logique (je le montre dans le modèle non-MVC parce qu'il semble que vous n'utilisez pas le modèle MVC de votre 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
    }
}
23
répondu Geronimo 2014-09-10 21:33:55

utiliser les timeouts n'est pas une bonne solution, cependant avoir à compter sur tout dans le gestionnaire de magasin n'est pas génial non plus.

je ferais quelque chose comme:

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
}

Si vous l'utilisez beaucoup, vous pouvez même le transformer en une classe.

6
répondu Evan Trimboli 2012-06-12 22:10:40

étendre le magasin-ajouter la propriété 'loaded' à la classe enfant, outrepasser ' initComponent ()' et attacher à l'événement 'load' à l'intérieur de celui-ci, relancer le 'loaded' vers true à l'intérieur du gestionnaire d'événements, ajoutez le ' isLoaded ()' méthode valeur de retour de la propriété' loaded'.

dans l'autre sens, si vous utilisez http transport-store.proxy.Connecticut.isLoading ()

regardez

2
répondu pacman 2012-06-12 19:40:33
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);
})
2
répondu o_nix 2012-06-12 20:37:58

si vous avez un problème parce que les combobox ne sont pas affichés/rafraîchis correctement quand les magasins prennent trop de temps à charger, la solution est de créer chaque magasin qui doit être utilisé dans un combobox comme ceci

Ext.create("Ext.data.Store", {
    ...,
    loading: true,
    ...
});

Comboboxes vérifiez ce paramètre dans les magasins qu'ils utilisent pour rafraîchir l'information une fois qu'elle est chargée, mais parfois le combobox est créé et rafraîchi avant même que le magasin commence à charger et le drapeau 'loading' est mis à true, Et alors il ne rafraîchira pas sa valeur quand le magasin termine le chargement. Le paramétrer à true corrige explicitement le problème. Je ne sais pas si c'est votre cas, mais j'ai pensé le mentionner au cas où.

2
répondu Triqui 2014-01-17 11:03:16

Use Sett JS

Deft JS est un addon injecté par injection de dépendance. Il permet à l'utilisateur d'ajouter des promesses dans les appels AJAX et la promesse est résolu que lorsque l'appel est terminé. Lien pour Habile JS. Utilisez Ext.différer.Tous les(); pour charger tous vos 5 magasins et une fonction de rappel particulière sera appelée une fois que tous les magasins sont chargés. Dans cette fonction, implémentez votre logique.

1
répondu Mano Aravindhan 2016-03-27 15:20:38

ExtJs Magasin de la méthode charger et la méthode load ont une fonction de rappel.

j'ai créé une démo. vous pouvez vérifier ici Sencha violon

cette fonction va créer le stockage et le retour.

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'
            }
        }
    });
}

Par Exemple, j'ai matrice de magasin. Il contient storeId ou alias.

var storeArry = [],
    store = '';

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

sur chaque callback de magasin nous pouvons supprimer des données de storeArray ou maintenir une variable pour vérification.

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);
1
répondu Narendra Jadhav 2017-09-20 07:32:53