我们在本地模式下使用 jqGrid,作为我们的 ajax 调用的一部分,正在修改 Json 结果,以便将日期转换为有效的 JS 日期对象。问题是这些没有正确排序。
我的 colModel 如下:
{
name: 'reservationTime',
index: 'reservationTime',
sorttype: 'date'
}
在大多数情况下,它们是按“顺序”排列的,但第一个是从数据的中间开始的,而中间是从接近开头的记录开始的。
当我单击标题尝试对其进行升序/降序排序时,它根本没有改变。如果我对另一个工作正常的字段进行排序,然后当我按我的日期字段排序时,它将再次进行损坏的排序,但仅此而已。
最佳答案
jqGrid 不支持将 Date
作为比较操作中的 native 数据类型,因此我建议您使用两种方法作为解决方法。
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) 您可以扩展 _compare jqGrid 内部使用的函数来支持 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这解决了问题。
关于jqGrid 没有在 Date 对象上正确排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9727075/