我正在使用jsgrid。
我正在尝试将5000个注册表JSON放入网格中,但要逐页加载。例如,我不想一次读取所有5000个注册表,我将网格设置为按页面显示50个注册表,并且只想根据需要获取注册表。
此刻,我正在分页网格,但它总是读取所有json。这是我的控制器代码:
controller: {
loadData: function(filter) {
var def = $.Deferred();
$.ajax({
url: "http://www.json-generator.com/api/json/get/clGvbnRZmG?indent=2", //5000
//url: "http://www.json-generator.com/api/json/get/cpERCWvHzC?indent=2", //5
dataType: "json",
data: filter
}).done(function(response) {
var startIndex = (filter.pageIndex - 1) * filter.pageSize;
var filteredArray = response;
//if filter is passed
if (filter.name !== "") {
filteredArray= $.grep(filteredArray, function(item) {
return item.name.includes(filter.name);
});
} if (filter.age !== undefined) {
filteredArray= $.grep(filteredArray, function(item) {
return item.age === filter.age;
});
} if (filter.email !== "") {
filteredArray= $.grep(filteredArray, function(item) {
return item.email.includes(filter.email);
});
} if (filter.gender !== "") {
filteredArray= $.grep(filteredArray, function(item) {
return item.gender === filter.gender;
});
}
//if sorting is passed
if (filter.hasOwnProperty("sortField")) {
if (filter.sortOrder === "asc") filteredArray.sort(ascPredicateBy(filter.sortField));
else filteredArray.sort(descPredicateBy(filter.sortField));
}
var da = {
data: filteredArray.slice(startIndex, startIndex + filter.pageSize),
itemsCount: filteredArray.length
};
def.resolve(da);
});
return def.promise();
}
如您所知,我使用slice来获取对象数组的一部分以显示在该页面上。
可能吗?我不知道它只是关于jsgrid还是关于AJAX。我猜想使用AJAX不可能仅返回JSON的一部分。
最佳答案
jsGrid
用于处理分页,您可以在promise中删除那段代码!
要让jsGrid
处理分页,请设置以下内容:
paging: true,
pageLoading: true,
pageSize: 50,
然后,您的
loadData
控制器将在filter
参数中传递以下属性:pageSize
-除上一页外,每页应返回的记录数。pageIndex
-5,000条记录的第n页。当用户单击网格上的>或>>链接或页码链接时,这由jsGrid
确定。您需要提供合适的Web服务来使用这两个参数来返回正确的数据页。例如,可能类似于以下内容:
url: "/api/json/get/clGvbnRZmG/" + filter.pageSize + "/" + filter.pageIndex
并且返回的数据必须采用以下形式:
{
data: [ { ..first item ...}, { ..second item..}, ...],
itemsCount: n
}
其中
itemsCount
是记录的总数,即5000。