2011-01-19 6 views
6

(Ver this question y this question para el fondo ...)SlickGrid onSelectedRowsChange disparar dos veces cuando se seleccionó más de una fila?

Dado:

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

... cuando selecciono una fila (por ejemplo, la fila 5), ​​consigo una potencia de

[4] 

... que es lo que esperaría. Sin embargo, CMD + clic o SHIFT + Clic -ing otra fila (por ejemplo, la fila 3), además de esta fila me da una salida de

[2] 
[4, 2] 

... que no es lo que se espera (yo esperaría solo [4, 2]). Esto parece suceder siempre que el número de filas seleccionadas sea > 1. Así que, si tuviera que seguir para seleccionar otra fila (por ejemplo, la fila 17), me sale este

[16] 
[4, 2, 16] 

he añadido un punto de interrupción en la declaración console.log y verificó que el onSelectedRowsChanged está siendo despedido dos veces: una vez para la fila nuevamente hecha clic, y una vez para todas las filas seleccionadas.

¿Por qué es esto? Solo quiero que se dispare una vez, dándome la matriz completa de las filas seleccionadas. ¿Cómo podría lograr esto? ¿O me estoy perdiendo algo?

+0

¿Qué versión de SlickGrid estás usando? Estoy usando un checkout bastante actualizado de la rama "v2 master" (quizás a mediados de enero de 2011) y no experimenté este problema – fbuchinger

+0

Estoy usando "SlickGrid v2.0 alpha", directo desde el github página. Encontré la fuente del problema ... publicando a continuación ... – neezer

+0

Malo; actualizó la pregunta anterior (en lugar de responder a continuación). – neezer

Respuesta

3

El problema (lo he descubierto desde entonces) se encuentra en el modelo de selección de filas Slick.RowSelectionModel().

Específicamente, cuando se selecciona la fila, handleActiveCellChange() Y handleClick() estaban siendo llamados, cada uno, que llama setSelectedRanges(), mientras que el primero sólo lo establece en la fila Actualmente se hace clic, y el segundo conjuntos a todas las filas seleccionadas.

me fijo Esta cancelan el registro en init() (dentro slick.rowSelectionModel.js) _grid.onActiveCellChanged manejador y se trasladó a la llamada dentro 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; 
    } 

    ... 

} 

No sé si esto ha sido fijado por el autor en "maestro v2", como dijo @fbuchinger, y sé que este arreglo es rápido y sucio (esto rompe la navegación del teclado y la selección entre filas), pero funciona y me da el comportamiento esperado descrito en mi pregunta. Como me preocupo más por los clics que funcionan correctamente que por la navegación del teclado, me estoy quedando con esto por ahora.

¿Alguien sabe de una mejor manera?

Cuestiones relacionadas