如何在requestStart中修改kendo数据源过滤器

时间:2014-10-17 04:51:32

标签: kendo-ui kendo-datasource

我的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中修改过滤器时,就像上面的代码一样,它不起作用。请求使用旧过滤器发送。 我不知道我做错了什么。还有另一种方法来实现这样的行为吗?

1 个答案:

答案 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;    
            }
        }
    }),
});