我有一个可排序和可过滤的Kendo网格。当我导出时,我想导出当前可查看但不仅仅是当前页面的所有数据。
$("#grid").data("kendoGrid").dataSource
- >似乎是未分类和未过滤的原始项目列表。在Chrome开发者工具中,_data
和_pristine
似乎是相同的。
还有dataSource.view
,但它只是当前页面上可见的10个项目。
有没有办法访问已排序的列表和/或已过滤的列表?
更新: 我在Kendo论坛上找到了这个答案,看看它是否有帮助。 http://www.kendoui.com/forums/framework/data-source/get-filtered-data-from-paged-grid.aspx
答案 0 :(得分:4)
以下是访问过滤数据的方法:
var dataSource = $("#grid").data("kendoGrid").dataSource;
var filteredDataSource = new kendo.data.DataSource({
data: dataSource.data(),
filter: dataSource.filter()
});
filteredDataSource.read();
var data = filteredDataSource.view();
然后你可以遍历数据:
for (var i = 0; i < data.length; i++) {
result += "<tr>";
result += "<td>";
result += data[i].SiteId;
result += "</td>";
result += "<td>";
result += data[i].SiteName;
result += "</td>";
result += "</tr>";
}
答案 1 :(得分:2)
当只看内存中的本地数据时,大多数答案都适用于Kendo Grid。如果您正在使用远程数据(例如,您的网格绑定到ODATA源) - 您将需要遍历所有页面以获取过滤后的数据。
然而,这样做并不像我想的那么直接。
我想出了以下内容:
var filteredRows = [];
function getResults() {
var dataSource = $("#grid").data("kendoGrid").dataSource;
var filters = dataSource.filter();
var allData = dataSource.data();
var query = new kendo.data.Query(allData);
var data = query.filter(filters).data;
var totalRowCount = parseInt(dataSource.total().toString());
var totalPages = Math.ceil(totalRowCount / dataSource.pageSize());
PageTraverser(dataSource, 1, totalPages, filters, function () {
$('#pResults').text('Got ' + filteredRows.length + ' rows of filtered data.');
});
}
function PageTraverser(dataSource, targetPage, totalPages, filters, completionFunction) {
dataSource.query({
page: targetPage,
pageSize: 20,
filter: filters
}).then(function () {
var view = dataSource.view();
for (var viewItemId = 0; viewItemId < view.length; viewItemId++) {
var viewItem = view[viewItemId];
filteredRows.push(viewItem);
}
targetPage++;
if (targetPage <= totalPages) {
PageTraverser(dataSource, targetPage, totalPages, filters, completionFunction);
} else {
completionFunction();
}
});
}
答案 2 :(得分:1)
以下是我们目前的做法,尽管有多种选择:
var myData = new kendo.data.Query(dataSource.data()).filter(dataSource.filter()).data;
您只需调用一个新查询并应用网格已应用的当前过滤器,这将返回与网格完全相同的结果。