jqGrid过滤器或按日期搜索不起作用客户端

Posted

技术标签:

【中文标题】jqGrid过滤器或按日期搜索不起作用客户端【英文标题】:jqGrid filter or search by date not working client side 【发布时间】:2011-06-13 08:31:37 【问题描述】:

我有一个 ASP.NET MVC 3 页面。在它上面,我有一个表,我使用来自 ajax 调用的 JSON 数据将它变成了一个 jqGrid。网格具有以下设置:

myGrid = $('#myGrid');
myGrid.jqGrid(
    caption: 'My Grid',
    datatype: 'local',
    data: data.rows,
    height: 250,
    pager: '#myPager',
    viewrecords: true,
    colModel: [
        ...,
        
            label: 'blah',
            name: 'blah',
            align: 'left',
            sortable: true,
            editable: false,
            width: 85,
            formatter: 'date',
            sorttype: 'date',
            datefmt: 'm/d/Y',
            formatoptions:  srcformat: 'm/d/Y', newformat: 'm/d/Y' 
        ,
        ...
    ]
);

// turn on filter toolbar
myGrid.filterToolbar();

data.rows 从 ajax 调用返回。这适用于除一种以外的所有方式。我可以对客户端进行分页,对客户端进行排序,并按除显示 colModel 的字段之外的每个字段进行搜索。这个“blah”字段是一个日期字段,它以 mm/dd/yyyy 格式正确显示日期。但是,当我在工具栏中输入 11/17/2010 之类的内容并按 Enter 键时,搜索返回 0 条记录。

所以我深入研究了 jqGrid 代码,下面是它在搜索之前生成的内容:

"groupOp":"AND","rules":["field":"blah","op":"bw","data":"11/17/2010"]

最终,当它遍历每一行并评估字段上的操作时,eval(m) && p.push(this) 行,m 是这样的:

(String(this.blah).substr(0,10) == String("11/17/2010"))

基本上,在我看来,它没有识别出该字段是一个日期。它调用 parse 而不是 parseDate。有人知道如何解决这个问题吗?我知道搜索服务器端很容易,我可以传递那个字符串,解析它,然后 bam。但如果可以的话,我想留在客户端。我能够在 Oleg 和 Tom 提出的一些示例中复制这一点,所以这要么是一个问题,要么是我在配置中遗漏了一些东西......

【问题讨论】:

顺便说一下jqGrid可以为你做AJAX调用,所以data.rows的使用就不需要了。查看来自***.com/questions/2835957/…、***.com/questions/4169384/… 和trirand.com/blog/?page_id=393/feature-request/rest-support/… 的一些链接。我可以继续链接... 实际上,我不得不将网格的创建封装在我的 ajax 调用中。原因是我必须调用 GridUnload() 因为我正在动态更新过滤器工具栏中的下拉过滤器。我浏览了文档,找不到类似 trigger('reloadToolbar') 的东西。 【参考方案1】:

我觉得你的问题很有趣,所以我对你的问题 +1。因为你发了这条线

(String(this.blah).substr(0,10) == String("11/17/2010"))

用在eval 本地搜索期间我想你花了很多时间来了解本地搜索是如何实现的。因为您看到上面的行(请参阅(String(this.blah).substr(0,10) ...)不是应该做的(String(this.blah) 的值将是“2010-11-17”而不是“11/17/2010”),您可以覆盖jqGrid的对应函数($.jgrid.from里面的函数_getStr)并解决问题。

前段时间我花了很多时间准备了相应的the demo,它演示了这种技术。演示准备为the answer in trirand forum。在问题中,如果要搜索'benevise',则希望找到类似'bénevise' 的字符串。所以必须实现真正自定义的本地搜索。我希望这些信息足以让您解决您描述的问题。

更新:在我看来,我找到了一个更简单的解决方法。您应该为包含数据的'blah' 列定义searchoptions: sopt: ['eq','ne']。然后"bw"(开头)将不用于该列。 “等于”和“不等于”操作在本地搜索中正常工作。

更新 2:Here 是我使用 sopt 选项的工作示例。

【讨论】:

好的,我完成了这个例子,如果我改变我的源数据它就可以工作。我注意到您使用的数据的日期定义为“2007-09-01”。我的数据有:新日期(“2007-09-01”)。原因是我的源数据来自 ASP.NET MVC,我必须重写 JSON.parse 才能正确解释 Microsoft 的日期格式:/^\/Date\((\d+)\)\/$/ 所以这不是网格有问题,但是能够传入 Date 对象会很好。我认为唯一需要更改的是 parseDate 函数,添加: if (Object.prototype.toString.call(e) === '[object Date]') return e; 谢谢奥列格!

以上是关于jqGrid过滤器或按日期搜索不起作用客户端的主要内容,如果未能解决你的问题,请参考以下文章

Jqgrid排序和“没有记录消息”不起作用

带有熊猫的日期正则表达式过滤器不起作用

ASP.net:ext.net 网格面板过滤器日期不起作用

为什么jqgrid排序不起作用?

为啥我在 vue.js 中的自定义搜索过滤器不起作用?

jqgrid在IE8上不起作用