按日期范围过滤Kendo DataSource

时间:2017-02-06 21:42:35

标签: javascript kendo-ui filtering

我目前正在尝试使用Kendo DropDownList来过滤Kendo数据源,但它并没有像我预期的那样工作。

我有一个Kendo DropDownList,其中有一些选项允许用户过滤数据源1,3,6,9或12个月。我还使用moment.js来处理当前日期的月份添加。

这是我的DropDownList onChange事件:

onMonthRangeChange: function (e) {
    var value = e.sender.value();
    switch (value) {
        case "1":
            var oneMonth = moment().add(1, "month");
            var firstOfMonth = moment().startOf("month");
            viewModel.myTaskDataSource.query({
                logic: "and",
                filters: [
                    { field: "DueDate", operator: "gte", value: firstOfMonth },
                    { field: "DueDate", operator: "lte", value: oneMonth }
                ]
            });
            break;
        case "3":
            // similar to above code except for 3 months
        case "6":
            // similar to above code except for 6 months
        case "9":
            // similar to above code except for 9 months
        case "12":
            // similar to above code except for 12 month
    }
})

虽然我认为这会奏效,但事实并非如此。相反,它只显示DataSource中的所有内容。我甚至尝试将viewModel.myTaskDataSource.query更改为viewModel.myTaskDataSource.filter,但之后我收到以下错误:

  

未捕获的TypeError:e.indexOf不是函数 - kendo.all.js:1129

我也怀疑也许是因为Kendo和moment.js使用不同的时间格式,但即使将所有剑道日期解析为时刻日期,我也会遇到相同的错误。

1 个答案:

答案 0 :(得分:0)

经过大量的实验,我终于找到了解决方案!

我更仔细地查看了错误并注意到它提到了kendo.parseDate的内容,因此我知道导致过滤不起作用的日期存在问题。

我只是将toDate()添加到我的moment.js日期对象的末尾,现在一切都按预期工作了!

我的过滤现在如下所示:

onMonthRangeChange: function (e) {
    var value = e.sender.value();
    switch (value) {
        case "1":
            var oneMonth = moment().add(1, "month").toDate();
            var firstOfMonth = moment().startOf("month").toDate();
            viewModel.myTaskDataSource.filter({
                logic: "and",
                filters: [
                    { field: "DueDate", operator: "gte", value: firstOfMonth },
                    { field: "DueDate", operator: "lte", value: oneMonth }
                ]
            });
            break;
        case "3":
            // similar to above code except for 3 months
        case "6":
            // similar to above code except for 6 months
        case "9":
            // similar to above code except for 9 months
        case "12":
            // similar to above code except for 12 month
    }
})