2013-06-03 194 views
1

我目前的工作,因爲它有大量存儲的所有數據的煎茶觸摸應用程序中刪除從存儲單個過濾器,我想只有數據的一個子集工作。商店已被過濾到子集,然後我可能需要進一步過濾它。在煎茶觸摸2.X

我可以使用filter(COL,VAL)添加過濾器來店裏很輕鬆了。但我怎麼刪除/清除只過濾,如果我要「恢復」我的數據集的「原始」過濾較少,但是,仍然過濾的數據?

在API文檔,我只能找到clearFilter()這是沒用的,因爲它消除所有先前設置的過濾器

我只能認爲,這樣做會採取原始過濾器的快照,清除所有過濾器,然後重新申請原來的過濾器......但聽起來像它會非常顯著影響性能特別是如果原始數據集很大。

有沒有更好的方法來做到這一點?

+0

貴店從服務器加載它的數據,或者從一個客戶端代理? – rixo

+0

@rixo在應用程序加載時,數據最初從服務器獲取AJAX請求,然後存儲在本地計算機上,然後從那裏獲取數據,如果這樣可以回答您的問題?我們無法保證互聯網連接,所以如果有互聯網接入,它就會在一開始就「同步」,否則就會使用緩存數據。 – Maccath

回答

2

不會與本地過濾店工作,以及使用一些無證的功能,這樣就可能暴露你未來的API變化,但你存儲,您可以訪問Ext.util.Collection類型的data財產,這不暴露removeFilters方法。在其implementation

看,你看,你可以用這個類型的呼叫刪除您的過濾器:

store.data.removeFilters(col); 

// remove all filters at once, because the collection will be updated for each call to removeFilters 
store.data.removeFilters([col1, col2]); 

這樣做之後,你必須手動觸發事件通知的事情一定到商店:

var data = store.data; 
store.fireEvent('filter', store, data, data.getFilters()); 
store.fireEvent('refresh', store, data); 

現在,應用新的過濾器集將意味着通過所有集合中的項目循環(而不是隻已經通過前面的過濾器的)。所以,除非我已經錯過了一些東西,刪除過濾器代替,例如,用一整套全新的,不會讓你的任何性能增益來替換當前設置過濾器。

您必須小心的是一次性應用所需的過濾器更改(通過刪除或添加它們),因爲所有過濾器方法都會觸發所有項目的傳遞。

如果我是你,我不會太擔心,因爲AFAIK循環幾千個對象應該是一個幾乎即時的操作,即使在像手機這樣的小型處理器上。

+0

非常感謝,這工作。另外,有趣的是每個過濾器都需要傳遞所有項目。一位同事在研究一些性能問題時剛剛注意到了這一點 - 我們確實有相當多的過濾器和相當多的項目,而這看起來似乎正在放慢速度。我們正在研究使用各個商店來篩選數據的子集,以便我們不在所有商品上運行所有篩選器。再次感謝! – Maccath

+0

@rixo,你看這個邏輯有什麼問題嗎?它似乎是相似的。 http://stackoverflow.com/questions/24944201/extjs-4-store-data-not-populated-with-data-inside-store-load-callback-function – MacGyver