【问题标题】:Date "less but not empty" custom search in free-jqgrid在free-jqgrid中日期“少但不为空”自定义搜索
【发布时间】:2019-04-27 07:27:57
【问题描述】:

我正在使用 free-jqgrid 4.15.4 来显示数据。我需要使用Date less but not empty 过滤器搜索日期列,但它没有正确过滤。结果它给了我比搜索日期大的日期。

以下代码用于日期列中的自定义过滤器:

customSortOperations: {

dlne: {
                operand: "<!=''",
                text: "Date less but not empty",
                filter:function (options) {
                    var p = this.p, iCol = p.iColByName[options.cmName], cm = p.colModel[iCol],
                        newformat = cm.formatoptions != null && cm.formatoptions.newformat ?
                                cm.formatoptions.newformat :
                                $(this).jqGrid("getGridRes", "formatter.date.newformat"),
                        srcformat = cm.formatoptions != null && cm.formatoptions.srcformat ?
                                cm.formatoptions.srcformat :
                                $(this).jqGrid("getGridRes", "formatter.date.srcformat"),
                        fieldData = $.jgrid.parseDate.call(this, srcformat, options.item[options.cmName]),
                        searchValue = $.jgrid.parseDate.call(this, newformat, options.searchValue);
                    var retFData = convertD(fieldData), t = new Date(retFData);
                    if ((retFData.getFullYear() < searchValue.getFullYear()) && (retFData.getMonth() < searchValue.getMonth()) && (retFData.getDate() < searchValue.getDate())) {
                        return true
                    }
                }
           },
}

我用于将字符串转换为日期格式的convert 函数如下所示:

function convertD(dateField) {
var date = new Date(dateField),
    mnth = ("0" + (date.getMonth() + 1)).slice(-2),
    day = ("0" + date.getDate()).slice(-2);
// year= (date.getFullYear())

var retVal = [day, mnth, date.getFullYear()].join("/");
return retVal;
}

我从here 那里得到了这个想法,并做了一些改变,但似乎无济于事。因此请求社区对此提供帮助。

【问题讨论】:

  • 能否提供demo 一些测试数据,重现问题?输入数据的确切格式可能很重要。例如,您可以获取一些我之前创建的 jsfiddle 演示并对其进行修改,以便可以看到问题。
  • 另外我不明白var retFData = convertD(fieldData), t = new Date(retFData);这行的意思。如果使用formatter: "date"srcformatnewformat选项对应输入和显示数据格式,那么fieldDatasearchValue就已经是Date对象了。请参阅the old answer 的代码和演示。
  • 你好@Oleg,(这里)[jsfiddle.net/6rub7svz/1/] 是带有一些测试数据的 js fiddle 演示。在这里,您会看到一些日期列是空的。我想要的是创建一个自定义过滤器,它能够在不选择空行的情况下选择行。这里的操作符是 date less but not empty .

标签: jqgrid free-jqgrid


【解决方案1】:

dlne 的代码可以固定为例如以下:

dlne: {
    operand: "<!=''",
    text: "Date less but not empty",
    filter: function (options) {
        var p = this.p, iCol = p.iColByName[options.cmName], cm = p.colModel[iCol],
            newformat = cm.formatoptions != null && cm.formatoptions.newformat ?
                    cm.formatoptions.newformat :
                    $(this).jqGrid("getGridRes", "formatter.date.newformat"),
            srcformat = cm.formatoptions != null && cm.formatoptions.srcformat ?
                    cm.formatoptions.srcformat :
                    $(this).jqGrid("getGridRes", "formatter.date.srcformat"),
            fieldData, searchValue;

        // the exact condition to test for "empty" depend on the format of your data
        if (!options.item[options.cmName]) {
            return false; // ignore empty data
        }

        fieldData = $.jgrid.parseDate.call(this, srcformat, options.item[options.cmName]);
        searchValue = $.jgrid.parseDate.call(this, newformat, options.searchValue);
        return fieldData.getFullYear() < searchValue.getFullYear() ||
            (fieldData.getFullYear() === searchValue.getFullYear() &&
                fieldData.getMonth() < searchValue.getMonth()) ||
            (fieldData.getFullYear() === searchValue.getFullYear() &&
                fieldData.getMonth() === searchValue.getMonth() &&
              fieldData.getDate() < searchValue.getDate());
    }
}

https://jsfiddle.net/OlegKi/51vfn4k9/11/

【讨论】:

  • 您好@Oleg,虽然上述答案适用于其他列,但有一列的日期格式如下:“/Date(1547145000000)/”。所以这导致结果网格失败。您能告诉我如何更改该日期列的格式吗?
  • 另外,$(this).jqGrid("getGridRes", "formatter.date.srcformat") 给出的日期格式是 d-m-Y,我想要在 dd/mm/yy 中(例如:27/ 04/2019)。
  • @Chandan:为什么不像我问你的那样发布带有测试数据的演示?而不是你发布了我原来的演示。您能否修改我的演示并包含您的测试数据,其中还包括一些非空日期和空日期?此外,使用srcformat 也很重要,它与您的数据格式相对应。试试jsfiddle.net/OlegKi/51vfn4k9/16,它使用formatoptions: { srcformat: "d/m/Y", newformat: "d/m/Y" }。格式为"/Date(1547145000000)/" 的输入数据将被自动检测并处理忽略srcformat
  • 如果我正确理解您,那么您似乎还没有看到我之前发布的小提琴。这是 jsfiddle jsfiddle.net/40ckdxs1,其中包含与我在项目中使用的几乎相似的测试数据。格式选项formatoptions: { srcformat: "d/m/Y", newformat: "d/m/Y" } 在我的原始项目中,但我猜这种格式"/Date(1547145000000)/" 会导致问题。
  • @Chandan:您的上一个演示使用formatoptions: {srcformat:"d/m/Y", newformat: "d/m/Y" },但输入数据与srcformat 不对应:请参阅"2007-09-06""2007-10-03""12/10/2007" 之类的日期混合。您应该使用 one 格式,它对应于srcformat。此外,如果其他格式化数据(如“/Date(1547145000000)/”)导致问题,那么为什么不在演示中包含数据?只需发布演示,它可用于重现您遇到的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-10
  • 1970-01-01
  • 1970-01-01
  • 2012-08-01
  • 2015-12-03
  • 1970-01-01
相关资源
最近更新 更多