1 回答

TA貢獻1862條經驗 獲得超6個贊
您走在正確的軌道上,但您需要首先了解概念DataProvider
。
在客戶端(瀏覽器),一旦用戶與其進行交互,Vaadin 就會請求將數據顯示在組合框中。請求的數據類似于“數據中有多少項?”?這是計數查詢。假設您有 100 件商品?,F在,下一個請求是“給我要顯示的前 40 個項目”,這是獲取查詢。組合框將顯示返回的項目。一旦用戶向下滾動列表,就會發出另一個數據請求“給我接下來要顯示的 40 個項目”等。
總而言之,DataProvider
首先要求返回所有項目的計數,然后根據需要逐頁獲取數據。當用戶輸入過濾器時這也適用。不同之處在于您的計數和獲取查詢應考慮過濾器。
示例:用戶輸入了過濾器“xyz”,現在只有 50 個項目與此過濾器匹配(通過名稱或其他內容),因此您將在 count 方法中返回 50,并且您的 fetch 方法應該相應地進行過濾。
您遇到的異常只是指出您的 fetch 方法返回的項目多于 Vaadin 請求的項目(查詢參數中的“limit”參數)。這是因為您當前不處理偏移/限制。
您有兩種選擇來實施您的數據提供程序:
使用列表數據提供者
Vaadin 提供了for 列表ListDataProvider
的實現DataProvider
。分頁已經在實現中完成了,你不必關心它。使用該filteringBy
方法根據輸入的過濾文本過濾數據。
這種方式更容易,但不可擴展。這意味著如果您有很多項目,您將消耗大量內存和 CPU,因為整個數據都是從后端檢索到列表中的。如果您預計商品數量較少,請采用此方法。
或者實現您自己的 DataProvider
您可以實現自己的DataProvider
.?我建議從擴展AbstractBackendDataProvider
類(javadoc)開始。方法sizeInBackend
和fetchFromBackend
需要實施。請注意在 fetch 方法中實現分頁的偏移/限制參數。
如果您將分頁委托給數據庫(例如 SQL 或 no-sql 數據庫),則此方法是可擴展的。內存占用會很低,因為您只在內存中保留一頁。
添加回答
舉報