2016-12-14 56 views
1

我正在開發Ionic2應用程序ngrx離開頁面時從商店暫停更新

要從我的商店中選擇數據,我正在使用reselect

我有一些頁面使用相同的數據(來自同一個reducer),但與其他reducer數據結合,取決於當前頁面(這意味着每個頁面都有自己的重選器,但每個選擇器至少有一個與其他選擇器共同的論點,所以每當這些論點中的一個改變時,這些頁面的所有重排器都需要重新計算)。

它看起來是這樣的:

page1 = createSelector(fromState1.getData, fromCommonState.getData,(data, commonData) => {...}); 
page2 = createSelector(fromState2.getData, fromCommonState.getData,(data, commonData) => {...}); 
page3 = createSelector(fromState3.getData, fromCommonState.getData,(data, commonData) => {...}); 

我關心的是,如果有很多網頁時常見的狀態改變所有的選擇都重新計算,即使我只需要重新計算所使用的一個當前頁面。我認爲如果選擇器需要做複雜的事情,這可能會成爲一個很大的性能問題。

有沒有辦法從商店「暫停」獲取更新,直到我回到那個頁面?通過這種方式,只有當前頁面的選擇器將被重新計算。

或者還有另一種避免不必要計算的方法嗎?

回答

0

我在通過整個應用程序(或多個智能組件)使用通用文件(selectors.ts)時創建選擇器。對於你的情況,你爲什麼不簡單地把選擇器放在智能組件(頁面)中?這種方式只有在需要時才計算和訂閱。

reselect主要用於沒有使用Observable的庫,並且數據實際上會在每次狀態更改時被推送。像ngrx這樣的庫可以忽略不計,除非您使用大量數據。對我而言,這是一個不成熟的優化。

要暫停狀態,您可以在商店的某個位置維護當前頁面狀態,然後僅在狀態中的頁面匹配時才使用過濾器執行繁重操作。

let page3 = createSelector(
fromState3.getData, fromCommonState.getData, 
(data, commonData) => { 
    if(fromState3.selected) { 
     // Large computation 
    } 
});