jqGrid неправильно сортирует объект Date - PullRequest
3 голосов
/ 15 марта 2012

Мы используем jqGrid в локальном режиме, и в рамках нашего вызова ajax результат Json изменяется, чтобы даты преобразовывались в действительные объекты JS Date.Проблема в том, что они не сортируются должным образом.

Мой colModel ниже:

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

По большей части они находятся в «порядке», но первый находится посередине данных, а на полпути - запись околоначало.

Когда я нажимаю на заголовок, чтобы попытаться отсортировать его по asc / desc, он не меняется вообще.Если я сортирую другое поле, которое работает нормально, и когда я сортирую его по полю даты, оно снова выполнит неправильную сортировку, но это все.

1 Ответ

3 голосов
/ 16 марта 2012

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) Вы можете расширить функцию _compare , используемую внутри jqGrid для поддержки типа Date.Вы можете использовать трюк, который я описал в моем этом старом ответе .В случае использования _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, как я это продемонстрировал на демоверсии .

ОБНОВЛЕНО : я отправил запрос на извлечение , который решает проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...