jqGrid没有在Date对象上正确排序

时间:2012-03-15 19:48:10

标签: jqgrid

我们在本地模式下使用jqGrid,并且作为我们的ajax调用的一部分,正在修改Json结果,以便将日期转换为有效的JS Date对象。问题是这些没有正确排序。

我的colModel如下:

       {
            name: 'reservationTime',
            index: 'reservationTime',
            sorttype: 'date'
        }

在大多数情况下,它们处于“顺序”状态,但第一个是从数据的中间开始,而中途是从一开始就是一个记录。

当我点击标题尝试对其进行排序asc / desc时它根本不会改变。如果我排序另一个工作正常的字段,然后当我按日期字段排序时,它会再次进行破坏排序,但就是这样。

1 个答案:

答案 0 :(得分:3)

jqGrid在比较操作中不支持Date作为本机数据类型,因此我建议您采用两种方法作为解决方法。

1)您可以使用sorttype作为功能。在使用Date参数调用函数的情况下,该函数可以返回在比较操作中可以使用而不是 Date的字符串。例如

sorttype: function (d) {
    if ($.isFunction(d.toISOString)) {
        return d.toISOString();
    }

    return ISODateString(d);
    // see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date
    function ISODateString(d) {
        function pad(n) { return n < 10 ? '0' + n : n; }

        return d.getUTCFullYear() + '-'
            + pad(d.getUTCMonth() + 1) + '-'
            + pad(d.getUTCDate()) + 'T'
            + pad(d.getUTCHours()) + ':'
            + pad(d.getUTCMinutes()) + ':'
            + pad(d.getUTCSeconds()) + 'Z'
    }
}

2)您可以扩展jqGrid内部使用的_compare函数以支持Date类型。你可以使用我在this old answer中描述的技巧。如果使用_compare,代码将为

var oldFrom = $.jgrid.from;

$.jgrid.from = function (source, initalQuery) {
    var result = oldFrom.call(this, source, initalQuery),
        old_compare = result._compare;
    result._compare = function (a, b, d) {
        if (typeof a === "object" && typeof b === "object" &&
                a instanceof Date && b instanceof Date) {
            if (a < b) { return -d; }
            if (a > b) { return d; }
            return 0;
        }
        return _compare.call(this, a, b, d);
    };
    return result;
};

您可以在使用jqGrid之前插入代码,就像我在the demo上演示一样。

更新:我发布了the pull request来解决问题。