8

自分が取り組んでいるプロジェクトでSlickgridのテストを開始したばかりで、そのパフォーマンスに非常に感銘を受けています。私が持っている1つの要件は、複数の列で並べ替えることです。SlickgridのDataviewに頭を完全に巻き付けていないので、明らかな何かが欠けている可能性がありますが、複数の列でグリッドを並べ替える方法はありますか?UIが複数の並べ替えを処理できない場合でも、列を順番に、さらに昇順または降順で関数を呼び出せるようにしたいと思います。Datatablesでこれを行うことができましたが、グループ化がありません(プロジェクトのもう1つの要件)。

最悪の場合、サーバーで並べ替えを行い、静的に並べ替えられたクライアントにコンテンツを提供することにします。

4

4 に答える 4

7

途中で複数列の並べ替えを使用してdataViewで機能するようになりました。理解しやすいものでした。これはgithubの例からのものですが、dataView.sort()にもう1つのパラメーターを渡す必要があります。これは常に真である可能性があり、関数の並べ替え方向を管理できます。

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);
}

それが誰かを助ける場合に備えて。

于 2013-03-06T20:44:18.927 に答える
6

ソート比較子をチェーンして、複数の列のソートを行うことができます。する代わりに

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.
}

または、インラインで実装するだけです。

UIに並べ替え順序を反映する限り、直接行うことはできませんが、並べ替える列定義に「headerCssClass」を設定し、矢印を表示させることで、並べ替えインジケーターを適用できます。 'ソート列を示しています)。

于 2011-02-09T05:38:25.473 に答える
6

'multiColumnSort'オプションを使用する例がここにあります。

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

args.sortColsは常に1の配列であるため、これは機能しないと思います。

[編集]それが機能するためには、列ヘッダーをクリックする前にShiftキーを押す必要があります(あまり直感的ではありません)参照:https ://github.com/mleibman/SlickGrid/pull/276

于 2012-02-27T04:03:15.263 に答える
1

私はこれを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();      
});

以前のすべての注文を記憶しています。ただ動作します。期待どおりに動作します。

于 2012-03-20T21:45:19.427 に答える