javascript dojo dgrid

javascript - Clasificación no sensible a mayúsculas y minúsculas en dojo dgrid



(2)

De acuerdo, a falta de una mejor solución, descubrí que tenía que crear una versión personalizada de SimpleQueryEngine de dojo, agregando .toLowerCase() en ambos valores aquí . La razón por la que no se podía cambiar simplemente era porque ocurre dentro de una función interna (dentro de otra función) por lo que era más fácil crear otra versión por completo.

Luego, al crear la Memory , pasar el motor de consulta de la siguiente manera:

new Memory({ queryEngine : customEngine });

Y parece funcionar. Si hay una solución más limpia, comparte bc. Odio esta :)

¿Es posible ordenar sin sensibilidad a mayúsculas / minúsculas?

Por ejemplo, los géneros por defecto aparecen así:

Awesomeman adam beyonce

pero, me gustaría ordenar como:

adam Awesomeman beyonce

¿Es posible anular la sensibilidad fácilmente? Por lo que puedo decir, la grilla hereda de OnDemandGrid y OnDemandList , que ambos heredan de Grid y List . Para mi tienda, estoy usando la Memory envuelta en Observable .

A partir de ahora, estoy tratando de sobrescribir _setSort en List.js , sin embargo, eso no está funcionando. ¿Alguien que esté familiarizado con estos marcos?


Hay dos formas posibles de resolver esto:

  • En el extremo de la cuadrícula, manejando y cancelando el evento dgrid-sort
  • En el extremo de la tienda, extendiendo la query para forzar la sort y hacer lo que quiera (preferido)

Primero, la versión dgrid-sort :

grid.on(''dgrid-sort'', function (event) { // Cancel the event to prevent dgrid''s default behavior which simply // passes the sort criterion through to the store and updates the UI event.preventDefault(); // sort is an array as expected by the store API, but dgrid''s UI only sorts one field at a time var sort = event.sort[0]; grid.set(''sort'', function (a, b) { var aValue = a[sort.attribute].toLowerCase(); var bValue = b[sort.attribute].toLowerCase(); if (aValue === bValue) { return 0; } var result = aValue > bValue ? 1 : -1; return result * (sort.descending ? -1 : 1); }); // Since we''re canceling the event, we need to update the UI ourselves; // the `true` tells it to also update dgrid''s internal representation // of the sort setting, so that toggling between asc/desc will still work grid.updateSortArrow(event.sort, true); });

Si bien esto funciona para el manejo cuando el usuario hace clic en celdas de encabezado, no tendrá efecto para set(''sort'') llamadas programáticas set(''sort'') , o la configuración inicial de sort en el objeto pasado al constructor de Grilla, lo que podría ser problemático.

Dado que la clasificación es, en última instancia, una preocupación de la tienda, abordarla en el extremo de la tienda es realmente la solución preferible. Es cierto que dojo/store/Memory y concretamente dojo/store/util/SimpleQueryEngine no hace esto ... bueno ... simple ... pero una cosa a tener en cuenta sobre SimpleQueryEngine es que si pasas una función a través de queryOptions.sort lugar de queryOptions.sort que una matriz, se aplicará textualmente como la función de clasificación que se utilizará.

Esto significa que podemos tomar el conjunto de sort entrante que establecerá dgrid, escribir nuestra propia versión de la función de ordenación predeterminada de SimpleQueryEngine y también tener en cuenta la distinción entre mayúsculas y minúsculas, y almacenar eso en queryOptions.sort para la llamada heredada:

var CIMemory = declare(Memory, { query: function (query, queryOptions) { var sort = queryOptions && queryOptions.sort; if (sort) { // Replace sort array with a function equivalent that performs // case-insensitive sorting queryOptions.sort = function (a, b) { for (var i = 0; i < sort.length; i++) { var aValue = a[sort[i].attribute].toLowerCase(); var bValue = b[sort[i].attribute].toLowerCase(); if (aValue !== bValue) { var result = aValue > bValue ? 1 : -1; return result * (sort[i].descending ? -1 : 1); } } return 0; } } return this.inherited(arguments); } });

Usar esto en lugar de dojo/store/Memory hará que todos los géneros sean insensibles a las mayúsculas y minúsculas.

Tenga en cuenta que tomé un par de atajos sobre la función de sort SimpleQueryEngine (verificando null / undefined y forzando valores a primitivos). Altere la función de clasificación según sea necesario si necesita preocuparse por cualquiera de esas cosas.