2011-02-09 22 views
8

私が取り組んでいるプロジェクトではをテストし始めました。私はそのパフォーマンスに非常に感心しています。私が持っている1つの要件は、複数の列をソートすることです。 SlickgridのDataviewの周りに私の頭を包み込んでいるわけではないので、明らかに何かが見当たりませんが、複数の列にグリッドを並べ替える方法はありますか? UIが複数の並べ替えを処理できない場合でも、列のある関数を昇順または降順に呼び出すことができます。 Datatablesでこれを実行できましたが、グループ化はありません(プロジェクトの別の要件)。Slickgridを複数の列でソートする?

最悪の場合、私はサーバー上で並べ替えを実行し、静的にソートされたクライアントにコンテンツを返すことに頼ります。

答えて

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」を設定して、矢印を表示させることで適用できますそれ以外の場合は並べ替えの列を示しています)。

+0

ありがとうございます。これは私が必要としているようです。しかし、グリッドだけでソートすることはできますか?ソート/フィルタリングを実装するにはDataViewを使用する必要がありますか?私はそれをグリッドだけで表示していますが、DataViewを実装することは、私の仕事でもっと多くの作業が必要になるようです。 – technomalogical

+2

グリッドはデータを操作しません。あなたがやる。 つまり、ソートにはDataViewを使用する必要はありません。 データをソートし、グリッドを無効にしてデータの変更を反映させるだけです。 as:myData.sort(combinedComparer) – Tin

+0

私は現時点で同じ質問に取り組んでいます。私はマルチカラムのソートとフィルタリングが必要ですが、私はDataViewを実装していません。 DataViewは単一列ソートだけを行うようですが、おそらくそれを上書きする方法があります。 – Fantius

5

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

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

私はargs.sortColsはいつもの配列であるので、それは、しかし作品とは思わない1.

それが仕事のために、私はクリックする前にシフトを保持する必要があるためには、[編集] も参照してください。https://github.com/mleibman/SlickGrid/pull/276

1

これをデータビュー(シフトキーなし)で解決しようとしばらく過ごしましたが、私はそれを行う方法を見つけたと思います。

単一列ソート{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();  
}); 

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

4

私は途中で複数列の並べ替えで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); 
} 

場合によっては誰かを助ける。

関連する問題