2011-02-09 13 views
8

Ho appena iniziato a testare Slickgrid per un progetto a cui sto lavorando e sono molto impressionato dalle sue prestazioni. Un requisito che ho è l'ordinamento su più colonne. Non ho la testa completamente avvolta attorno al Dataview in Slickgrid, quindi forse mi manca qualcosa di ovvio, ma c'è un modo per ordinare una griglia su più colonne? Anche se l'interfaccia utente non è in grado di gestire l'ordinamento di più di uno, mi piacerebbe poter chiamare una funzione con le colonne in ordine, più in ordine crescente o decrescente. Sono stato in grado di farlo con Datatables, ma non ha il raggruppamento (un altro requisito per il progetto).Ordinamento di Slickgrid per più colonne?

Nel peggiore dei casi, ricorrerò a fare l'ordinamento sul server e servire il contenuto al client ordinato in modo statico.

risposta

6

È possibile concatenare i confronti di ordinamento per eseguire più ordinamenti di colonne. Invece di fare

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

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

si può fare

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

o semplicemente attuarla in linea.

Per quanto riguarda l'ordine di ordinamento nell'interfaccia utente, mentre non è possibile eseguire direttamente, è possibile applicare gli indicatori di ordinamento impostando "headerCssClass" sulle definizioni di colonna che si stanno ordinando e facendole visualizzare le frecce (o comunque stai indicando le colonne di ordinamento).

+0

Grazie a @tin. Questo sembra essere quello di cui ho bisogno. Ma posso ordinare solo con la griglia o devo usare DataView se voglio implementare l'ordinamento/filtraggio? L'ho visualizzato solo con la griglia, ma l'implementazione di DataView sembra implicare molto più lavoro da parte mia. – technomalogical

+2

La griglia non manipola i dati. Tu fai. Detto questo, non è necessario utilizzare DataView per ordinare. Basta ordinare i dati e invalidare la griglia per riflettere le modifiche nei dati. Come in: myData.sort (combinedComparer) – Tin

+0

Sto lottando con la stessa domanda al momento. Ho bisogno di ordinamento e filtraggio a più colonne, ma non ho implementato DataView. DataView sembra fare solo l'ordinamento a colonna singola, ma probabilmente c'è un modo per sovrascriverlo. – Fantius

1

abbiamo trascorso una durante il tentativo di risolvere questo problema con dataview (senza spostamento imbrogli chiave) e penso ho trovato il modo di farlo.

Utilizzare il tipo a colonna singola {multiColumnSort: false} e memorizzare gli argomenti di ordinamento in una chiusura. Rinviare al precedente comparatore se i campi sono uguali.

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

ricorda tutti gli ordini precedenti. funziona funziona come previsto.

4

Ho ottenuto il funzionamento per DataView con ordinamento a più colonne nel modo. È stato anche il più facile da capire. Questo è dall'esempio in github, tranne che devo passare un altro parametro per dataView.sort(). Può sempre essere vero, e tu puoi occuparti della direzione del tipo nella tua funzione.

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

Nel caso in cui aiuti qualcuno.

Problemi correlati