劍道UI版本2015.2.805劍道UI下拉列表虛擬化第2頁上失敗取回的
我有一個劍道DROPDOWNLIST每個實例配置在劍道文檔的數據做分頁。它適用於頁面1,使用take/skip參數從服務器加載80個條目。當我將列表向下翻到新項目應該加載的位置時,我可以在提琴手中看到小部件正在請求take = 80,skip = 80(這是第2頁),服務器正在返回請求的記錄。但小部件只是不停地重複請求相同的頁面,直到我停止。在此期間,卸載的條目在列表中顯示爲帶有動畫旋轉器的「加載」。
要做虛擬化,widget需要一個valueMapper(我使用舊的kendo UI,因此它是必需的)。我已經實現了它,雖然我不清楚它應該返回什麼(我相信項目索引),但我從文檔中知道,如果它請求不存在的值返回[],那就是我在這種情況下所做的。我修改了convertValues函數,只發送一個索引而不是數組,但valueMapper只在初始化時調用一次,所以我返回的任何錯誤都不會對這個問題產生任何影響(我相信)。當widget首次在fiddler中初始化時,我看到valueMapper被調用的值爲-1,並且服務器返回[],那麼widget會調用分頁數據(take = 80,skip = 0)和服務器返回並且小部件正常顯示數據。
當我向下翻頁到卸載的項目時,窗口小部件會調用第2頁數據(take = 80,skip = 80),服務器返回它,但小部件不斷重新請求數據。小部件在第一次調用之後從不調用valueMapper(這可能是正常的)。
我已經爲高度和itemHeight設置了正確的頁面大小,但是這隻會導致第一頁被加載兩次(它不是)。
下面是設置:
wizard.paramMap = function (data, type) {
var params = {};
params.take = data.take;
params.skip = data.skip;
return params;
};
$("#clientField").kendoDropDownList({
autoWidth: true,
dataTextField: "text",
dataValueField: "value",
virtual: {
itemHeight: 26,
valueMapper: function(options) {
$.ajax({
url: resturi + "clientlist/valueMapper",
dataType: "json",
type: "GET",
data: convertValues(options.value),
success: function (data) {
console.log("valueMapper = " + data)
options.success(JSON.parse(data));
}
})
}
},
height: 520,
dataSource: {
transport: {
read: {
url: resturi + "clientlist",
dataType: "json",
type: "get"
},
parameterMap: wizard.paramMap
},
schema: {
data: function (response) {
console.log("clientlist = " + response);
var o = JSON.parse(response);
return o;
}
},
pageSize: 80,
serverPaging: true
}
});
function convertValues(value) {
var data = {};
value = $.isArray(value) ? value : [value];
for (var idx = 0; idx < value.length; idx++) {
//data["values[" + idx + "]"] = value[idx];
data["values"] = value[idx];
break;
}
return data;
}
我想出了什麼是錯,但它引發了更多的問題。結果集中只有96個條目,所以第1頁正常工作,第2頁請求80,但只有16條,所以它一直問。如果在服務器端填充空白記錄到結果並返回80,它將起作用,但下拉列表允許我保持向下滾動到頁面3,4,n,因爲它不知道有多少記錄。在kendo數據網格中分頁需要一個頁面才能返回總記錄數量,只是出於這個原因 - 這應該如何工作的下拉列表?解決了 – kpg
- 服務器必須返回每個頁面的總數據量 - 請參閱下面的答案。 – kpg