我的kendoDatasource中有以下requestStart:
requestStart: function (e) {
var oldFilters = e.sender._filter ? e.sender._filter.filters : [],
endDateTime;
$.each(oldFilters, function (index, currFilter) {
if (currFilter.field === 'StatusChangeDate' && currFilter.operator == 'eq') {
endDateTime = new Date(currFilter.value.getYear(), currFilter.value.getMonth(), currFilter.value.getDay(), 23, 59, 59);
oldFilters.push({ field: currFilter.field, operator: 'gt', value: currFilter.value });
oldFilters.push({ field: currFilter.field, operator: 'lt', value: endDateTime });
oldFilters.splice(index, 1);
}
});
if (e.sender._filter) {
e.sender._filter.filters = oldFilters;
}
},
我希望在运算符为'eq'时更改DateTime过滤器,以禁用过滤精度。 但是当我在requestStart中修改过滤器时,就像上面的代码一样,它不起作用。请求使用旧过滤器发送。 我不知道我做错了什么。还有另一种方法来实现这样的行为吗?
答案 0 :(得分:0)
当调用requestStart时,查询已经提交为按原样发送。该活动只是让你知道,但没有给你机会改变任何东西。
不要试图以后退方式潜行,只需调用dataSource的filter()方法来过滤您想要的任何方式。 DataSource将在本地过滤数据或根据serverFiltering选项的值向服务器发出请求。
var filters = myDataSource.filter() || [],
endDateTime;
$.each(filters, function (index, currFilter) {
if (currFilter.field === 'StatusChangeDate' && currFilter.operator == 'eq') {
endDateTime = new Date(currFilter.value.getYear(), currFilter.value.getMonth(), currFilter.value.getDay(), 23, 59, 59);
filters.push({ field: currFilter.field, operator: 'gt', value: currFilter.value });
filters.push({ field: currFilter.field, operator: 'lt', value: endDateTime });
filters.splice(index, 1);
}
});
// Now apply the new filter to the dataSource.
// This will generate a request if serverFiltering == true.
myDataSource.filter(filters);
另外请注意,您应该尽量避免访问任何以“_”开头的属性,如“e.sender._filter”中所示。这通常被认为是一个“私人”财产,可能会随着下一个版本而改变。您可以通过调用不带参数的filter()来获取当前过滤器,如上面的代码所示。这是剑道的另一个一般规则,没有args意味着得到一个值,args意味着设置一个值。
修改强>
您还可以使用dataSource的transport.parameterMap属性劫持CRUD请求以修改和/或添加参数。请注意,此方法不会修改dataSource的过滤器属性。它只会更改发送到服务器的请求参数。
$("#myGrid").kendoGrid({
// Column definitions, etc...
dataSource = new kendo.data.DataSource({
transport: {
// create, read, update, destroy definitions...
parameterMap: function(data, type) {
if ((type === "read") && data.filter && data.filter.filters) {
var filters = data.filter.filters;
for (var index = 0; index < filters.length, index++) {
var currFilter = filters[index];
if (currFilter.field === 'StatusChangeDate' && currFilter.operator == 'eq') {
endDateTime = new Date(currFilter.value.getYear(), currFilter.value.getMonth(), currFilter.value.getDay(), 23, 59, 59);
filters.push({ field: currFilter.field, operator: 'gt', value: currFilter.value });
filters.push({ field: currFilter.field, operator: 'lt', value: endDateTime });
filters.splice(index, 1);
break;
}
});
}
return data;
}
}
}),
});