将Kendo Grid列显示为DateTime,但在过滤时忽略Time

时间:2015-01-05 18:35:39

标签: javascript datetime kendo-ui kendo-grid

我有一个剑道网格和一个列“销售时间”显示为MM / dd / yyyy HH:mm a(2015年1月3日下午2:34)。

现在我希望能够按日期过滤,忽略时间。但默认情况下,过滤器正在查看时间,因此我使用“Is Equal To”过滤的任何日期都不会返回任何结果。

这是我用来说明问题的JSFiddle:http://jsfiddle.net/dmathisen/yx7huvxp/

还有一些代码,所以我可以发布jsfiddle链接:)

columns: [
    { field: "ModelName", title: "Model" },
    { field: "DefaultMonoCPP", title: "Mono Cost" },
    { field: "SaleTime", title: "Sale Time", format: "{0:g}" }
]

3 个答案:

答案 0 :(得分:4)

您可以定义一个schema.parse函数,该函数会生成一个名为SaleDate的附加字段,该字段仅包含Date的{​​{1}}部分。

然后,在显示网格中的列时,使用此选项。

类似的东西:

SaleTime

您的JSFiddle在此修改:http://jsfiddle.net/OnaBai/yx7huvxp/10/

答案 1 :(得分:3)

Telerik不支持开箱即用。请参阅herehere,这个人使用逻辑日期时间过滤器转换做了一个出色的服务器端solution。但是,就我个人而言,我总是觉得去服务器端解决客户端问题很奇怪。

所以最后我通常只将日期和时间部分分成两个不同的列,或者使用datetime而不提供过滤器选项,或者在设计中尽可能避免使用datetime字段。

我也有一个有效的数据源黑客,但是......我不建议使用它。如果您对此感兴趣,那么它就是......


基本上我的想法是复制数据列,一个是完整日期,另一个只有日期,没有时间。然后在列UI上,您希望显示完整日期,但对于基础数据源,您希望使用假日期。用户始终会看到完整日期,但过滤器将使用永恒日期。

这是demo

RandDate是我的完整日期。 RandDate2是我没有时间的假部分日期。

RandDate: Mon Apr 07 2014 06:15:00 GMT-0400 (Eastern Daylight Time)
RandDate2: Mon Apr 07 2014 00:00:00 GMT-0400 (Eastern Daylight Time)

在我的列定义中,我使用部分日期作为字段,但使用模板显示完整日期

{
    field: "RandDate2", //Set column source to the fake one without time
    title: "Random Date",
    template: "#= kendo.toString(RandDate,'g') #", //display the full date and time
}

答案 2 :(得分:0)

我使用SharePoint 2010 REST服务作为数据源,这为我完成了这项工作: ("魔术"发生在parameterMap部分)



$scope.mainGridOptions = {
...
dataSource: new kendo.data.DataSource({
            type: "odata",
            transport: {
                read: {
                    url: $scope.filterParams.url,
                    dataType: "json"
                },
                parameterMap: function (options, type) {
                    if (options && options.filter && options.filter.filters && options.filter.filters.count != 0) {
                        options.filter.filters.forEach(function (f) {
                            if (f.operator && f.operator == 'eq' && f.value && typeof f.value.getMonth == 'function' && typeof f.value.getMonth() == 'number') {
                                f.operator = 'gt';
                                var newFilter = {
                                    field: f.field,
                                    operator: 'lt',
                                    value:  new Date(f.value.getFullYear(), f.value.getMonth(), f.value.getDate(), 23, 59, 59)
                                };
                                options.filter.filters.push(newFilter);
                            }
                        })
                    }
                    var params = kendo.data.transports.odata.parameterMap(options, type);
                    delete params.$format;
                    return params;
                }
            },
            ...
}




它基本上做了什么: 如果应用了某些过滤器,请检查操作员是否为“eq”。 (等于),如果值是日期。因为类型f.value 是一个对象, f.value instanceof Date 始终为true,即使您说的是 f.value = new Date(' foo'),检查值对象是否具有函数' getMonth'返回一个数字似乎是合法的,以验证f.value是一个日期。 然后该功能改变了'eq'运营商到'。 (注意f.value的时间是00:00:00!)。之后,它会创建一个新的过滤器' lt'运算符,相同的日期但是另一个时间(在我的情况下是23:59:59)并将其推送到filters数组。 因为sharepoint在这种格式中遇到了一些问题'属性,我们删除它。

所以' 日期GT 19.10.2015 00:00:00和日期lt 19:10:2015 23:59:59 '与' date eq 19.10.2015 '

基本相同