plugin - Cómo ordenar solo la página actual usando Jquery Datatable
jquery datatables change search text (2)
He estado usando la datatable Jquery para muchos proyectos y está funcionando perfectamente para todos los escenarios.
Para mi proyecto actual requiero que la clasificación se realice solo para la página actual, pero de forma predeterminada la tabla de datos clasificará los datos completos y redibujará la tabla completa.
Estaba seguro de que habrá una configuración simple para habilitar esta característica, pero no pude encontrar ninguna, excepto estas líneas de su foro
var table = $(''#example'').DataTable();
// Sort by column 1 and then re-draw
table
.order( [[ 1, ''asc'' ]] )
.draw( false );
Intenté esto pero no parece tener ningún efecto. cualquiera lo ha implementado con éxito antes de compartir su código.
Antes de preguntar cómo ordenar solo la página actual, debemos responder las siguientes preguntas:
- ¿Por qué queremos hacer tal clasificación?
- Deberíamos hacerlo?
- ¿Tiene algún sentido?
- ¿Cuáles son las implicaciones de tal decisión?
Cuando queremos ejecutar una consulta y mostrar la lista de resultados que estamos tratando:
- criterios de búsqueda
- criterios de clasificación
- paginación
Estos tres elementos están fuertemente relacionados y definen claramente lo que el usuario ve en la pantalla.
Podemos tener, por ejemplo, siguiente descripción:
Hay una lista de actores. Está ordenado por nombre y dividido en páginas (50 elementos por página). Y estamos en la tercera página.
Cuando tenemos tales reglas, el usuario tiene una buena orientación en esta lista. Ve a Michael Caine en la parte superior y a Shon Connery en la parte inferior de la página. Cuando quiere encontrar a Robert Duvall, sabe que debería ir unas páginas más allá. Y cuando quiere ver a estos actores ordenados por edad, simplemente recurre a las listas y regresa a la primera página.
Pero, ¿qué ocurre si proporcionamos clasificación adicional solo para la página actual? Esto alteraría la cohesión del sistema anterior. ¿Cómo suena si le decimos al usuario:
Ahora está viendo la tercera página de la lista ordenada por nombre de actores recurridos (página) por edad.
¿Qué puede ganar este usuario al recurrir solo a la página actual? ¿Jerarquía de edad de actores con nombre que comienza con ''C''? En la parte superior de la página aparecerá el actor más viejo de esta página. Pero el usuario no sabe si es el actor más viejo de toda la lista. Y si no, ¿en qué página debería buscar el más viejo? Tal recurso no tiene valor y anula la clasificación inicial (que tenía algún valor).
Tal recurso también puede llevar al usuario a una seria confusión. Él puede perder su orientación sobre la clasificación original y la clasificación de páginas.
Conclusiones
No veo ningún sentido al proporcionar clasificación para una sola página. Lo encuentro dañino Entonces deberías usarlo solo si tienes argumentos fuertes para eso.
Actualización 1
Aunque estoy de acuerdo con rtruszk, sigo pensando que se debe encontrar / explorar una solución si 0) no tiene otra opción o 1) su cliente no está dispuesto a discutir los cambios de UX.
Ejemplo de trabajo: http://jsfiddle.net/ebRXw/63/
Logré lo que buscaba filtrando las filas visibles actualmente de DataTable. Hice mi mejor esfuerzo para encontrar una solución dentro de DataTables, y uno puede existir, pero al final usé jQuery y una tabla hash para identificar y filtrar las filas visibles actualmente.
Estoy seguro de que esto se puede optimizar aún más. Con suerte, te mueve en la dirección correcta.
$(document).ready(function () {
var table = $(''#example'').DataTable({
"columnDefs": [{
"targets": [0],
"visible": false,
"searchable": true
}]
});
// Show page 0
table.page(0).draw(false);
// Sort by column 1 (Name)
table.order([1, ''asc'']).draw(false);
$("#ReloadTable").click(function () {
// Clear the current filter
oTable = $(''#example'').dataTable();
oTable.fnFilter('''', 0);
oTable.fnFilter('''');
// Reset all "visible" values in the first cell
var table = $(''#example'').DataTable();
table.rows().indexes().each(function (idx) {
var d = table.row(idx).data();
table.row(idx).data()[0] = 0;
d.counter++;
table.row(idx).data(d);
});
});
$("#FilterCurrentPage").click(function () {
// Create a hash of the index of currently visible rows
var h = new Object();
var x = $(''.odd,.even'').filter(function () {
var idx = $(this)[0]._DT_RowIndex;
h[idx] = idx;
return this.style.display == ''''
});
// update the first value based on the currently visible rows
var table = $(''#example'').DataTable();
table.rows().indexes().each(function (idx) {
var d = table.row(idx).data();
if (h.hasOwnProperty(idx)) {
table.row(idx).data()[0] = 1;
}
d.counter++;
table.row(idx).data(d);
});
// filter rows with a value of 1 in the first cell
oTable = $(''#example'').dataTable();
oTable.fnFilter(1, 0);
});
});
Actualización 0
Todavía no he encontrado una solución, pero estoy convencido de que existe. El siguiente código seleccionará y devolverá las filas visibles actuales en su tabla de datos.
var x = $(''.odd,.even'').filter(function () {
$(this).addClass(''selected''); // Select the visible rows
return this.style.display == ''''
});
Del mantenedor de DataTables :
¿Hay alguna manera fácil de decir tablas de datos que quiero ordenar y volver a dibujar solo la paginación actual?
En DataTables 1.9- no, no hay una manera de hacerlo, pero en 1.10 puede usar table.order (...) .draw (false); para preservar la paginación. 1.10 pre beta está disponible en git si quieres darle un golpe :-)
Alano
a través de tablas de datos: ordena solo la paginación actual de la tabla
Sin embargo, es posible que pueda obtener las filas visibles actuales, ordenarlas y mostrarlas de alguna manera. El siguiente código proporciona las filas visibles actuales después del filtrado.
var table = $(''#example'').DataTable();
table.$(''tr'', {"filter":"applied"});
Ver también: