Kendo - 通过页面上的代码保存网格过滤器只会出现日期过滤网格列的问题

Bru*_*Lee 5 grid jquery date filter kendo-ui

我的网页上有一个kendo网格,我正在尝试以编程方式保存网格过滤器sessionStorage,这在大多数情况下都有效.

我遇到的问题是,当我在日期列上放置一个过滤器时,当我尝试在用户导航回该页面时重新应用该过滤器时,它会在其中一个匿名函数中出错b/c该toLowerCase()方法不存在.如果我在字符串列上过滤,过滤器工作正常.我可以应用多个过滤器并将它们保存到sessionStoragevar并重新应用到网格就好了.只有日期列我才有问题.

我花了一段时间才弄清楚如何使用语法获取kendo网格过滤器:

var theKgridFilters = $("#gridList").data("kendoGrid").dataSource.filter();
Run Code Online (Sandbox Code Playgroud)

然后将它存储在sessionStoragevar中,我必须使用stringify()该对象,否则它将不会保存该var中的网格过滤器:

sessionStorage.setItem('theGridFilters', JSON.stringify(theKgridFilters));
Run Code Online (Sandbox Code Playgroud)

接下来,要在网格上重新应用过滤器,我必须将字符串转换回JSON对象b/c过滤器是具有属性的对象,所以我使用了这个:

if (sessionStorage.theGridFilters) {                            
    gridFilter = sessionStorage.theGridFilters;
    gridFilter = $.parseJSON(gridFilter);
}
Run Code Online (Sandbox Code Playgroud)

哪个应用于网格dataSource过滤器属性:

filter: gridFilter, 
Run Code Online (Sandbox Code Playgroud)

当我在日期列上过滤网格时,错误将在以下行中抛出:

function anonymous(d, __f, __o) {
    return (d.Last_Modified_Date.toLowerCase() == '2013-01-25t06:00:00.000z')
}
Run Code Online (Sandbox Code Playgroud)

有过滤器的字段在哪里Last_Modified_Date.我很习惯使用jQuery,JS等,而且从我读过的内容来看,anonymous()fns是动态创建的,所以我不相信我能改变它.

我在网上查了一下,有人提到要在toString()之前添加功能toLowerCase().我在调试器中尝试了它并且它工作但我不知道如何通过代码访问它来进行更改.看起来基于IE调试器的调用堆栈从kendo.web.js文件调用匿名函数.

此外,调试器中的日期字段的值如下所示:

d.Last_Modified_Date    Wed Jan 25 00:00:00 CST 2013    Object, (Date)
Run Code Online (Sandbox Code Playgroud)

所以我甚至不确定它是否可以将该值等同于上述匿名fn中的字符串,即:'2013-01-25t06:00:00.000z'.

如果有人有任何见解可以解决此日期过滤器保存问题,请告知我们.这让我疯了.也许还有另一种我不知道保存网格过滤器的方法.

提前谢谢,布鲁斯!

Ata*_*hev 5

您观察此行为的原因是JSON.parse不会创建JavaScript Date对象.它改为创建字符串:

typeof $.parseJSON(JSON.stringify(new Date())); // "string"
Run Code Online (Sandbox Code Playgroud)

然后,Kendo UI框架尝试将日期过滤为字符串,从而导致错误.

解决方法是使用指定reviver:

 function dateReviver(key, value) {
    var a;
    if (typeof value === 'string') {
        a = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
        if (a) {
            return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],
                            +a[5], +a[6]));
        }
    }
    return value;
 }

 gridFilter = JSON.parse(gridFilter, dateReviver);
Run Code Online (Sandbox Code Playgroud)