2010-08-12 40 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