我们在本地模式下使用jqGrid,并且作为我们的ajax调用的一部分,正在修改Json结果,以便将日期转换为有效的JS Date对象。问题是这些没有正确排序。
我的colModel如下:
{
name: 'reservationTime',
index: 'reservationTime',
sorttype: 'date'
}
在大多数情况下,它们处于“顺序”状态,但第一个是从数据的中间开始,而中途是从一开始就是一个记录。
当我点击标题尝试对其进行排序asc / desc时它根本不会改变。如果我排序另一个工作正常的字段,然后当我按日期字段排序时,它会再次进行破坏排序,但就是这样。
答案 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来解决问题。