Сортировка Slickgrid по нескольким столбцам? - PullRequest
8 голосов
/ 09 февраля 2011

Я только начал тестировать Slickgrid для проекта, над которым я работаю, и я очень впечатлен его производительностью.У меня есть одно требование - сортировка по нескольким столбцам.Я не полностью обернул голову вокруг Dataview в Slickgrid, так что, возможно, я упускаю что-то очевидное, но есть ли способ сортировки сетки по нескольким столбцам?Даже если пользовательский интерфейс не может обрабатывать сортировку более чем на один, я хотел бы иметь возможность вызывать функцию со столбцами по порядку, а также по возрастанию или убыванию.Я смог сделать это с Datatables , но у него нет группировки (еще одно требование для проекта).

В худшем случае я прибегну к сортировкесервер и подача контента обратно клиенту статически отсортированы.

Ответы [ 4 ]

7 голосов
/ 07 марта 2013

У меня это работает для DataView с сортировкой по нескольким столбцам. Был проще всего понять тоже. Это из примера в github, за исключением того, что я должен передать еще один параметр для dataView.sort (). Это всегда может быть правдой, и вы можете позаботиться о направлении сортировки в вашей функции.

grid.onSort.subscribe(function (e, args) {
    gridSorter(args.sortCols, dataView);
});

function gridSorter(sortCols, dataview) {
    dataview.sort(function (row1, row2) {
        for (var i = 0, l = sortCols.length; i < l; i++) {
            var field = sortCols[i].sortCol.field;
            var sign = sortCols[i].sortAsc ? 1 : -1;
            var x = row1[field], y = row2[field];
            var result = (x < y ? -1 : (x > y ? 1 : 0)) * sign;
            if (result != 0) {
                return result;
            }
        }
        return 0;
    }, true);
}

На всякий случай, если кому-то это поможет.

6 голосов
/ 27 февраля 2012

Здесь приведен пример, в котором используется опция 'multiColumnSort'.

http://mleibman.github.com/SlickGrid/examples/example-multi-column-sort.html

Я не думаю, что это работает, хотя args.sortCols всегда является массивом 1.

[Edit] Для того, чтобы это работало, мне нужно удерживать Shift, прежде чем щелкнуть заголовок столбца (не очень интуитивно, ИМХО). Смотри также: https://github.com/mleibman/SlickGrid/pull/276

6 голосов
/ 09 февраля 2011

Вы можете объединять в цепочку сортировщики для сортировки по нескольким столбцам.Вместо того, чтобы делать

function comparerOnCol1(a, b) {
  return a["col1"] - b["col1"];
}

function comparerOnCol2(a, b) {
  return a["col2"] - b["col2"];
}

, вы можете сделать

// sort by col1, then col2
function combinedComparer(a, b) {
  return comparerOnCol1(a, b) || comparerOnCol2(a, b);  // etc.
}

или просто внедрить его в строку.

Что касается отражения порядка сортировки в пользовательском интерфейсе, тогда как вы можетеВы не можете напрямую применить индикаторы сортировки, установив «headerCssClass» в определениях столбцов, по которым вы сортируете, и заставив их отображать стрелки (или, тем не менее, вы указываете столбцы сортировки).

1 голос
/ 21 марта 2012

Я потратил некоторое время, пытаясь решить эту проблему с помощью dataview (без махинаций с ключом сдвига), и я думаю, что нашел способ сделать это.

Использование сортировки по одному столбцу {multiColumnSort: false} и сохранение аргументов сортировки взакрытие.Отложите на предыдущий компаратор, если поля равны.

var currentSortCmp = null;  
grid.onSort.subscribe(function (e, args) {

    // declarations for closure
    var field = args.sortCol.field;
    var sign = args.sortAsc ? 1 : -1;
    var prevSortCmp = currentSortCmp;

    // store closure in global
    currentSortCmp = function (dataRow1, dataRow2) {

        var value1 = dataRow1[field], value2 = dataRow2[field];

        //if equal then sort in previous closure (recurs)
        if (value1 == value2 && prevSortCmp)
            return prevSortCmp(dataRow1, dataRow2);

        return (value1 == value2 ? 0 : (value1 > value2 ? 1 : -1)) * sign;
    };
    dataView.sort(currentSortCmp);

    grid.invalidate();
    grid.render();      
});

запоминает все предыдущие заказы.просто работает.работает как положено.

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