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 lasort
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.