Tengo una lista de estudiantes que debo mostrar al usuario en una página web en formato tabular.
Los elementos se almacenan en la base de datos junto con la información de Ordenar.
En la página web, el usuario puede reorganizar el orden de la lista arrastrando y soltando los elementos en el orden de clasificación deseado, similar a esta publicación .
A continuación se muestra una captura de pantalla de mi página de prueba.
En el ejemplo anterior, cada fila tiene información de orden de clasificación adjunta. Cuando coloco a John Doe (Id. De estudiante 10) sobre la fila Id. De estudiante 1, el orden de la lista ahora debe ser: 2, 10, 1, 8, 11.
¿Cuál es la forma optimista (que consume menos recursos) de almacenar y actualizar la información del orden de clasificación?
Mi única idea por ahora es que, para cada cambio en el orden de clasificación de la lista, se debe actualizar el valor SortOrder de cada objeto, lo que en mi opinión consume muchos recursos.
Solo para tu información: podría tener como máximo 25 filas en mi tabla.
Respuestas:
Se me ocurrió algo que puede reducir sus consultas. Aquí, en mi ejemplo, he agregado una nueva
column
para ordenar llamadapos
. Entonces, inicialmente sin arrastrar tu tabla será como:Ahora, consideremos que arrastraste
Item 4
entreItem 1
&Item 2
. Ahora, será un nuevopos
valor para , que es . Por lo tanto, solo necesitará actualizar una sola fila en la base de datos. Y obtendrás ...Item 4
(20 + 10) / 2
15
Aquí hay un diagrama de flujo con los casos extremos.
i
es el nuevo índice de matriz de su fila después de arrastrarlo -Este diagrama de flujo no maneja
ArrayOutOfBound
cheques. Y, para casos extremos, necesitará más de una consulta.Como solo tiene 25 filas, puede tomar un valor muy grande (p
10,000
. Ej. ) Para la diferencia de posición (tomé10
para este ejemplo). Cuanto mayor sea el valor, menos chocará.fuente
Item A
con la posición 123 yItem C
con la posición 124, no hay una manera fácil de ponerItem B
entre ellos. Una solución sería usar números fraccionarios (por ejemplo, flotantes), pero también tienen una precisión limitada. A veces es mejor renumerar, normalizar los intervalos y mantener las cosas simples.Personalmente, devolvería una matriz JSON para los datos del back-end. Luego usaría JavaScript (JQuery o knockout) para mostrar y ordenar y volver a ordenar los datos. De esa manera, la ordenación tiene carga cero en el servidor.
fuente
Está buscando una manera amigable con los recursos para manejar esto, pero también es imprescindible una perspectiva amigable para el usuario. Recomiendo solicitudes individuales después de cada artículo reordenado. Cada llamada le permite verificar si fue aceptada o fallida.
Alternativamente, usar un objeto JSON (@ tom-squires) es una buena idea para reducir la sobrecarga de HTTP y el procesamiento del lado del servidor, pero finalmente requiere más código para manejar las solicitudes en el lado del servidor y del cliente. Si eso está bien, pasar el objeto al servidor es técnicamente más eficiente. También permite un retraso de un par de segundos para permitir múltiples pedidos antes de una sola solicitud, si lo desea.
Tenga en cuenta que, para proporcionar al usuario un comentario de las solicitudes fallidas, deberá analizar un objeto JSON de respuesta del servidor para averiguar qué elemento falló y restablecer la IU en función de eso.
fuente
Algo así en el controlador de eventos drop, donde e es el evento DnD.
fuente