2011-01-19 9 views
6

(Vedi this question e this question per lo sfondo ...)SlickGrid onSelectedRowsChange si attiva due volte quando viene selezionata più di una riga?

Data:

grid = new Slick.Grid("#myGrid", data, columns, options); 
grid.setSelectionModel(new Slick.RowSelectionModel()); 
grid.onSelectedRowsChanged.subscribe(function() { 
    row_ids = grid.getSelectedRows(); 
    console.log(row_ids); 
}); 

... quando seleziono una riga (ad esempio, riga 5), ​​ottengo una potenza di

[4] 

... che è quello che mi aspetterei. Tuttavia, CMD + clic o Maiusc + clic -ing un'altra riga (ad esempio, riga 3), in aggiunta a questa riga mi dà una potenza di

[2] 
[4, 2] 

... che non è quello che mi aspetterei (mi aspetterei solo [4, 2]). Ciò sembra accadere fintanto che il numero di righe selezionate è > 1. Quindi, se dovessi continuare a selezionare un'altra riga (ad esempio, riga 17), vorrei ottenere questo

[16] 
[4, 2, 16] 

ho aggiunto un punto di interruzione sulla dichiarazione console.log e verificato che il onSelectedRowsChanged è essere licenziato due volte: una volta per il riga appena cliccata e una volta per tutte le righe selezionate.

Perché è questo? Voglio solo che sia sparato una volta, dandomi l'array completo delle righe selezionate. Come potrei realizzare questo? O mi sta sfuggendo qualcosa?

+0

quale versione di SlickGrid stai usando? Sto usando un checkout abbastanza aggiornato dal ramo "v2 master" (forse a metà gennaio 2011) e non ho riscontrato questo problema – fbuchinger

+0

Sto usando "SlickGrid v2.0 alpha", direttamente dal github pagina. Ho trovato la fonte del problema ... pubblicando di seguito ... – neezer

+0

Il mio male; aggiornata la domanda sopra (piuttosto che rispondere di seguito). – neezer

risposta

3

Il problema (che ho scoperto) si trova nel modello di selezione riga Slick.RowSelectionModel().

In particolare, quando è stata selezionata la riga, handleActiveCellChange() E handleClick() venivano chiamati, ciascuno che chiama setSelectedRanges(), mentre il primo imposta solo alla riga correntemente selezionato, e quest'ultimo imposta su tutte le righe selezionate.

ho fissato questo annullamento della registrazione in init() (all'interno slick.rowSelectionModel.js) _grid.onActiveCellChanged gestore e si trasferisce la chiamata all'interno handleClick():

function init(grid) { 
    _options = $.extend(true, {}, _defaults, options); 
    _grid = grid; 
    // _grid.onActiveCellChanged.subscribe(handleActiveCellChange); 
    _grid.onKeyDown.subscribe(handleKeyDown); 
    _grid.onClick.subscribe(handleClick); 
} 

... 

function handleClick(e, data) { 

    ... 

    if (!e.ctrlKey && !e.shiftKey && !e.metaKey) { 
     handleActiveCellChange(e, data); 
     return false; 
    } 

    ... 

} 

Non so se questo è stato fissato dall'autore in "maestro v2", come ha detto @fbuchinger, e so che questa soluzione è veloce e sporca (questo rompe la navigazione della tastiera e la selezione tra le righe), ma funziona e mi dà il comportamento previsto descritto nella mia domanda. Poiché mi preoccupo di più dei clic che funzionano correttamente rispetto alla navigazione da tastiera, per ora mi sto attenendo a questo.

Qualcuno sa di un modo migliore?

Problemi correlati