Kendo ui Kendo ui dropdownlist虚拟化在第2页检索时失败
剑道ui版本2015.2.805 我根据剑道文档中的示例配置了剑道下拉列表,用于数据分页。它适用于第1页,使用take/skip参数从服务器加载80个条目。当我将列表向下翻页到应该加载新项目的位置时,我可以在fiddler中看到小部件正在请求take=80、skip=80(即第2页),服务器正在返回请求的记录。但是小部件只是不断地重复请求相同的页面,直到我停止它。在此期间,卸载的条目在列表中显示为使用动画微调器“加载” 要进行虚拟化,小部件需要一个valueMapper(我使用的是较旧的kendo UI,所以它是必需的)。我已经实现了它,虽然我不清楚它应该返回什么(我相信是项目索引),但我从文档中知道,如果它请求返回一个不存在的值[],我就是这样做的。我修改了convertValues函数,只发送一个索引,而不是示例数组,但是valueMapper只在初始化时调用一次,因此我返回的任何错误都不会对这个问题产生任何影响(我相信) 当小部件第一次在fiddler中初始化时,我看到valueMapper被调用,值为-1,服务器返回[],然后小部件调用分页数据(take=80,skip=0),服务器返回该数据,小部件正常显示数据 当我向下翻页到卸载的项目时,小部件调用第二页数据(take=80,skip=80),服务器返回它,但小部件继续重新请求数据。小部件在第一次调用后从不调用valueMapper(这可能是正常的) 我已经为height和itemHeight正确设置了页面大小,但这只会导致第1页加载两次(事实并非如此) 以下是设置:Kendo ui Kendo ui dropdownlist虚拟化在第2页检索时失败,kendo-ui,kendo-dropdown,Kendo Ui,Kendo Dropdown,剑道ui版本2015.2.805 我根据剑道文档中的示例配置了剑道下拉列表,用于数据分页。它适用于第1页,使用take/skip参数从服务器加载80个条目。当我将列表向下翻页到应该加载新项目的位置时,我可以在fiddler中看到小部件正在请求take=80、skip=80(即第2页),服务器正在返回请求的记录。但是小部件只是不断地重复请求相同的页面,直到我停止它。在此期间,卸载的条目在列表中显示为使用动画微调器“加载” 要进行虚拟化,小部件需要一个valueMapper(我使用的是较旧的kend
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;
}
wizard.paramMap=函数(数据,类型){
var params={};
params.take=data.take;
params.skip=data.skip;
返回参数;
};
$(“#clientField”).kendoDropDownList({
自动宽度:正确,
dataTextField:“文本”,
dataValueField:“值”,
虚拟:{
身高:26,
valueMapper:函数(选项){
$.ajax({
url:resturi+“clientlist/valueMapper”,
数据类型:“json”,
键入:“获取”,
数据:转换值(options.value),
成功:功能(数据){
console.log(“valueMapper=“+数据”)
options.success(JSON.parse(data));
}
})
}
},
身高:520,
数据源:{
运输:{
阅读:{
url:resturi+“客户端列表”,
数据类型:“json”,
键入:“获取”
},
parameterMap:wizard.paramMap
},
模式:{
数据:功能(响应){
console.log(“clientlist=“+response”);
var o=JSON.parse(响应);
返回o;
}
},
页面大小:80,
服务器分页:真
}
});
函数值(值){
变量数据={};
value=$.isArray(value)?value:[值];
对于(var idx=0;idx
数据源返回的数据必须与分页数据一起返回总记录计数。这与kendo数据网格中的分页相同。因此,将服务器输出更改为:
{"total":X,"data":[...some data...]}
并将模式设置为:
schema: {
total: function (response) {
return (JSON.parse(response).total);
},
data: function (response) {
return (JSON.parse(response).data);
}
}
解决了问题。我发现了问题所在,但这会引发更多问题。结果集中只有96个条目,因此第1页工作正常,第2页请求80个条目,但只得到16个条目,所以它一直在请求。如果在服务器端,我将空白记录填充到结果并返回80,则它可以工作,但dropdownlist允许我继续向下滚动到第3、4、n页,因为它不知道有多少记录。剑道数据网格中的分页需要一个页面来返回总记录计数,正是出于这个原因-这对于dropdownlist应该如何工作?已解决-服务器必须返回每个页面的总数据计数-请参阅下面的答案。