我有一个处理服务器端分页,过滤和排序的API。为了构建dataSource url,我将transport.read设置为函数(如described in the documentation)。这工作正常,除了我的API被调用两次:在初始ajax请求期间一次,然后在调用options.success(result)之后再次调用。其他人遇到这个? options.success()究竟做了什么导致另一个XHR GET请求已经拥有它需要的数据?
更新
感谢Rick在下面的评论,我做了今天早上应该做的事情,并开始评论其他kendo网格配置代码,看看会发生什么。当更改dataSource导致第二个API调用时,执行该函数。这是必需的,因此在对网格进行排序时,发送到API的URL包含更新的排序请求。我想现在我很困惑为什么当我已经设置了默认的排序参数时,更改事件会在初始加载时触发。更新了我的配置。
这是我的dataSource传输配置:
var initGrid = function (take, skip, currPage, field, direction, model, gridElement, cols) {
//set up dataSource
var dataSource = new kendo.data.DataSource({
transport: {
read: function (options) {
$.ajax({
url: apiUrl + '?take=' + take + '&skip=' + skip + '&page=' + currPage + '&pageSize=' + take + '&sort%5B0%5D%5Bfield%5D=' + field + '&sort%5B0%5D%5Bdir%5D=' + direction,
dataType: 'json',
success: function (result) {
// by the time this is reached, the API has already been called once
// the result variable contains the necessary data
options.success(result); // the API is called again when this line executes
},
error: function (result) {
options.error(result);
}
});
}
},
change: function () {
var currentSorting = JSON.stringify(this.sort());
if (currentSorting != sorting) {
sorting = currentSorting;
this.sort(JSON.parse(sorting));
}
field = JSON.parse(sorting)[0].field;
direction = JSON.parse(sorting)[0].dir;
},
sort: { field: field, dir: direction }, //default sort
....
}
}
答案 0 :(得分:2)
原来问题是使用dataSource更改事件来尝试检测排序何时更新。我没有意识到我已经访问了transport.read函数的“options”参数中的所有更新属性。因此,我不是在监听更改事件,更新变量和手动调用sort,而是在我首先构建URL时使用了options对象。 Take,skip,page,pageSize和sort都在那里。这样,剑道就可以自己处理所有事情。新配置:
var initGrid = function (model, gridElement, cols) {
//set up dataSource
var dataSource = new kendo.data.DataSource({
transport: {
read: function (options) {
$.ajax({
url: apiUrl + '?take=' + options.data.take + '&skip=' + options.data.skip + '&page=' + options.data.page + '&pageSize=' + options.data.pageSize + '&sort%5B0%5D%5Bfield%5D=' + options.data.sort[0].field + '&sort%5B0%5D%5Bdir%5D=' + options.data.sort[0].dir,
dataType: 'json',
success: function (result) {
options.success(result);
},
error: function (result) {
options.error(result);
}
});
}
},
sort: { field: 'Id', dir: 'desc' }, //default sort
....