首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Kendo ui下拉列表虚拟化在第2页检索失败

Kendo ui下拉列表虚拟化在第2页检索失败
EN

Stack Overflow用户
提问于 2017-01-15 02:36:09
回答 1查看 1.6K关注 0票数 2

剑道ui版本2015.2.805

我在kendo文档中为每个示例配置了kendo下拉列表,用于对数据进行分页。它适用于页面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加载两次(实际上并非如此)。

下面是设置:

代码语言:javascript
复制
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;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-15 08:01:47

数据源返回的数据必须返回记录总数以及分页数据。这与kendo datagrid中的分页相同。因此,将服务器输出更改为:

代码语言:javascript
复制
{"total":X,"data":[...some data...]}

以及用于以下各项的架构:

代码语言:javascript
复制
schema: {
        total: function (response) {
            return (JSON.parse(response).total);
        },
        data: function (response) {
            return (JSON.parse(response).data);
        }
    }

修复了问题。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41653556

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档