0

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

4

1 回答 1

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 请求以修改和/或添加参数。请注意,此方法不会修改数据源的过滤器属性。它只会更改发送到服务器的请求参数。

$("#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;    
            }
        }
    }),
});
于 2014-10-17T09:42:17.343 回答