我遇到的问题是,当我在日期列上放置一个过滤器时,当我尝试在用户导航回该页面时重新应用该过滤器时,它会在其中一个匿名函数中出错b / c toLowerCase( )方法不存在.如果我在字符串列上过滤,过滤器工作正常.我可以应用多个过滤器并将它们保存到sessionStorage var并重新应用到网格就好了.只有日期列我才有问题.
我花了一段时间才弄清楚如何使用语法获取kendo网格过滤器:
var theKgridFilters = $("#gridList").data("kendoGrid").dataSource.filter();
然后将它存储在sessionStorage var中,我必须stringify()该对象,否则它将不会保存该var中的网格过滤器:
sessionStorage.setItem('theGridFilters',JSON.stringify(theKgridFilters));
接下来,要在网格上重新应用过滤器,我必须将字符串转换回JSON对象b / c过滤器是具有属性的对象,所以我使用了这个:
if (sessionStorage.theGridFilters) { gridFilter = sessionStorage.theGridFilters; gridFilter = $.parseJSON(gridFilter); }
哪个应用于网格dataSource过滤器属性:
filter: gridFilter,
当我在日期列上过滤网格时,错误将在以下行中抛出:
function anonymous(d,__f,__o) { return (d.Last_Modified_Date.toLowerCase() == '2013-01-25t06:00:00.000z') }
具有过滤器的字段是Last_Modified_Date.我很习惯使用jQuery,JS等,而且从我读过的内容来看,anonymous()fns是动态创建的,所以我不相信我能改变它.
我在网上查了一下,有人提到在toLowerCase()之前添加toString()函数.我在调试器中尝试了它并且它工作但我不知道如何通过代码访问它来进行更改.看起来基于IE调试器的调用堆栈从kendo.web.js文件调用匿名函数.
此外,调试器中的日期字段的值如下所示:
d.Last_Modified_Date Wed Jan 25 00:00:00 CST 2013 Object,(Date)
所以我甚至不确定它是否可以将该值等同于上述匿名fn中的字符串,即:’2013-01-25t06:00:00.000z’.
如果有人有任何见解可以解决此日期过滤器保存问题,请告知我们.这让我疯了.也许还有另一种我不知道保存网格过滤器的方法.
提前致谢,
布鲁斯!
解决方法
typeof $.parseJSON(JSON.stringify(new Date())); // "string"
然后,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);