1 回答

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