我有兩個Sencha/ExtJS4網格使用完全相同的數據(即相同的store.proxy.url),但每個使用不同的過濾器,所以每個都有自己的獨立存儲。問題是我正在做一個不必要的AJAX調用來檢索額外的副本。如何在兩個商店之間共享一個AJAX呼叫?
對於獨立過濾,建議進行單個AJAX調用,然後在兩個存儲之間共享數據的建議方法是什麼?
可能的解決方案:
- 創建擴展的同店兩班?
- 使用相同的代理實例嗎?
- 檢索一個商店,然後克隆它?
我有兩個Sencha/ExtJS4網格使用完全相同的數據(即相同的store.proxy.url),但每個使用不同的過濾器,所以每個都有自己的獨立存儲。問題是我正在做一個不必要的AJAX調用來檢索額外的副本。如何在兩個商店之間共享一個AJAX呼叫?
對於獨立過濾,建議進行單個AJAX調用,然後在兩個存儲之間共享數據的建議方法是什麼?
可能的解決方案:
Ext JS 4框架似乎是以每個視圖都有自己的存儲爲目的而構建的。正如其他答案中所述,您最好的選擇是創建第二個存儲並將所有記錄從一個存儲到另一個存儲。
function cloneStore(src, dest) {
var recs = src.getRange(); // returns array of records
dest.loadRecords(recs); // removes existing records before batch add
}
該功能的確切實現可能會有所不同,這取決於您需要如何分散數據。如果每個網格僅需要開始的數據子集,則可以從Ajax調用初始化主存儲,然後直接在store.data混合聚合上使用過濾器創建兩個子存儲。
// Note: This function isn't exactly "good practice"
// Actual implementation may vary
function populateSubStores(master, storeA, storeB) {
var dataA = master.data.filter(/* filter criteria for store A */),
dataB = master.data.filter(/* filter criteria for store B */);
// dataA and dataB are MixedCollections of records
storeA.loadRecords(dataA.getRange());
storeB.loadRecords(dataB.getRange());
}
或其一些變化。這應該足以讓你開始正確的方向。
如果你真的很喜歡,你可以創建一個新類型的商店,它維護代表不同視圖的過濾器狀態的單獨的混合集合,然後返回每個過濾器狀態作爲具有相同接口的商店,但具有實現它根據「主」商店的內部表示進行操作,以便現有視圖可以在沒有覆蓋的情況下運行。但我不推薦它。
您可以創建一個店鋪的兩個實例,然後就從一個存儲中複製數據到另一個使用getRange()
和add()
方法。創建兩個類似乎不合理。
我個人會克隆商店。如果您不必同時顯示兩個不同的結果,您還可以使用過濾器(設置/取消設置/重置)中的一部分來獲取理想的結果。 – ted 2012-04-06 13:23:32