2010-08-12 94 views
4

我在Ext.Window的子类中有三个商店(Ext.data.JsonStore)。我想在所有这些中调用save(),直到完成后才显示一个等待屏蔽,然后关闭窗口或处理错误。ExtJS - 在多个商店中保存数据

有没有一种方法可以做到这一点,而不会结束一些杂乱的东西?我正在考虑通过在第一个等的save事件内的第二个商店中调用save(),然后再将一些东西拼凑在一起,以便在最后一个商店完成保存时设置回调,但这看起来像我最终会有一个大的嵌套混乱。所以如何建立这个干净的任何建议将不胜感激。

回答

1

喜欢的东西:

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]); 

对不起,没时间来测试 - 但算法中可能会出现。

+0

谢谢。我认为这样的事情可能会起作用。它实际上有点痛苦,虽然因为'save()'似乎没有任何参数,所以你必须先订阅每个商店的事件......单调乏味 – 2010-08-12 16:19:09

+0

我发布了一个答案,以我更新的尝试为基础这个。再次感谢 – 2010-08-13 11:09:54

0

我已经结束了使用类似Drasill的建议,但它有点混乱。我想如果因为事件的运作方式而无需等待第一次完成而将它调用两次,那么它会搞砸了。

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

没有测试,但也许更简单的解决方案:http://pastebin.com/zYn7xCKe。感谢你的接纳。 – Drasill 2010-08-13 12:22:59