2013-10-07 34 views
1

我打算創建一個單元格表,顯示有關來自數據庫的聯繫人信息。 我即將展示的表格有很多行。gwt cellTable緩存在客戶端

目前我設法輕鬆顯示數據。 我唯一的問題是,當我在尋呼機中更改頁面時。 gwt一次又一次地發送數據請求,即使我已經請求過這些頁面!

我該如何讓客戶端緩存?這裏

PS是一塊的onRangeChanged代碼:

AsyncDataProvider<Contact> provider = new AsyncDataProvider<Contact>() { 
    @Override 
    protected void onRangeChanged(HasData<Contact> display) { 
    int start = display.getVisibleRange().getStart(); 
    int end = start + display.getVisibleRange().getLength(); 
    end = end >= DBHelper.size() ? DBHelper.size() : end; 
    List<Contact> sub = DBHelper.get(start, end); 
    updateRowData(start, sub);   
    } 
}; 

編輯:

西班牙油條建議,我將創建一個輔助類(如DBHelper),將緩存一些結果和多數民衆的我將如何跳過數據庫訪問。這不是我想要的,我暗示有在客戶端的緩存,助手類仍然不會救我一個客戶端 - >服務器調用。

回答

2

您應該實現一個類來幫助客戶端進行緩存。它將作爲您的服務界面(DBHelper)和您的CellTable之間的一層。它將管理RPC請求,並且只在數據需要刷新時才進行RPC調用。否則,它將從某個緩存結構(如Map)返回緩存的數據。

實施後,您的AsyncDataProvider將撥打CacheImpl.get(start, end);而不是DBHelper.get(start, end)

+0

請在我的原始文章中看到我的編輯 – Urbanleg

+0

@Urbanleg如果您只想獲取一次數據,然後遍歷檢索的數據,則必須使用「ListDataProvider」類而不是「AsyncDataProvider」。您仍然可以進行RPC調用,然後將結果發送到'ListDataProvider',它將同步處理分頁和排序。 – Churro

1

爲了幫助記憶,我使用了一個EntityWindow,它所做的就是保持前兩個範圍,並先取兩個範圍。通過這種方式,您可以限制緩存在內存中的對象數量,並在後臺獲取後兩個對象,以使下一頁更快。在加載時,您可以獲取呈現視圖所需的數據,並在後臺運行並獲取2x或3x display.getVisibleRange()。getLength()實體,以便立即加載下一個按鈕。當用戶點擊下一個時,您可以獲取未來的元素並刪除以前的元素。