2010-08-12 1 views
4

J'ai trois magasins (Ext.data.JsonStore) dans une sous-classe de Ext.Window. Je voudrais appeler save() sur tous ces éléments, afficher un masque d'attente jusqu'à la fin, puis fermez la fenêtre ou gérer une erreur.ExtJS - sauvegarde de données dans plusieurs magasins

Y a-t-il un moyen de le faire sans finir avec quelque chose de vraiment désordonné? Je pensais faire cela en appelant save() sur le deuxième magasin de l'événement save sur le premier etc, puis bricoler quelque chose ensemble afin que je puisse définir un rappel à appeler lorsque le dernier magasin a fini d'enregistrer, mais cela me semble va se retrouver avec un gros gâchis imbriqué. Donc, toutes les suggestions sur la façon de construire cela proprement serait grandement appréciée.

Répondre

1

Quelque chose comme:

var saveStores = function(stores) { 

    if (stores.length === 0) { 
     console.log("All stores saved"); 
    } else { 
     var store = stores.pop(); 
     store.save({ 
      callback : function() { 
       saveStores(stores); 
      } 
     }); 
    } 
} 

saveStores([store1, store2, store3]); 

Désolé, pas de temps pour tester - mais le algo pourrait être là.

+0

merci. Je pense que quelque chose comme ça va probablement marcher. c'est en fait un peu plus pénible car 'save()' ne semble pas prendre d'arguments donc vous devez d'abord vous abonner à l'événement sur chaque magasin ... fastidieux –

+0

J'ai posté une réponse avec ma tentative mise à jour basée sur ce. merci encore –

0

J'ai fini par utiliser quelque chose comme Drasill, mais ça a été un peu compliqué. J'imagine que ça bousillerait si vous l'appeliez deux fois sans attendre la fin de la première fois, à cause de la façon dont les événements fonctionnent.

var save_multiple_stores = function(stores, success, fail) { 
    if (stores.length === 0) { 
     if (success) { 
      success(); 
     } 
    } else { 
     var store = stores.pop(); 

     var listeners = {} 

     var unbind_listeners = function() { 
      for (var evt in listeners) { 
       store.un(evt, listeners[evt]); 
      } 
     } 

     var onsuccess = function() { 
      unbind_listeners(); 
      save_multiple_stores(stores, success, fail); 
     } 

     var onfail = function() { 
      unbind_listeners(); 
      if (fail) { 
       fail(); 
      } 
     } 

     store.on('save', onsuccess); 
     listeners.save = onsuccess; 
     store.on('exception', onfail); 
     listeners.exception = onfail; 

     var num_records = store.save(); 
     //save event will not fire if there are no changed records 
     if (num_records <= 0) { 
      onsuccess(); 
     } 
    } 
}; 
+0

Non testé non plus, mais peut-être une solution plus simple: http://pastebin.com/zYn7xCKe. Merci de l'acceptation. – Drasill