Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kendo ui Kendo ui dropdownlist虚拟化在第2页检索时失败_Kendo Ui_Kendo Dropdown - Fatal编程技术网

Kendo ui Kendo ui dropdownlist虚拟化在第2页检索时失败

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

剑道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页加载两次(事实并非如此)

以下是设置:

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应该如何工作?已解决-服务器必须返回每个页面的总数据计数-请参阅下面的答案。