2011-03-29 21 views
6

Quiero ordenar la tienda (ArrayStore y GroupingStore) de forma alfanumérica y archivar INSENSITIVAMENTE. Estoy usando el método singleSort(), pero clasifica mayúsculas y minúsculas.extjs - Ordenar tienda de forma alfanumérica y sin distinguir entre mayúsculas y minúsculas

Por ejemplo,

data = ['c', '1', 'A', 'a', 'C'] 
output = ['1', 'A', 'C', 'a', 'c'] 
myoutput = ['1', 'a', 'A', 'c', 'C'] or [['1', 'A', 'a', 'C', 'c'] // This is what I want 

Cualquier sugerencia sobre cómo lograr esto?

Respuesta

6

Agregue esto a su código ... desconfíe de sus ámbitos porque hará que todo tipo de información en la página sea insensible. Encontré este código en los foros y lo utilicé con éxito en 3.2.1.

Ext.data.Store.prototype.sortData = function(f, direction){ 
direction = direction || 'ASC'; 
var st = this.fields.get(f).sortType; 
var fn = function(r1, r2) { 
    var v1 = st(r1.data[f]), v2 = st(r2.data[f]); 
    // ADDED THIS FOR CASE INSENSITIVE SORT 
    if (v1.toLowerCase) { 
     v1 = v1.toLowerCase(); 
     v2 = v2.toLowerCase(); 
    } 
    return v1 > v2 ? 1 : (v1 < v2 ? -1 : 0); 
}; 
this.data.sort(direction, fn); 
if (this.snapshot && this.snapshot != this.data) { 
    this.snapshot.sort(direction, fn); 
} 

}

+4

Cuando se trata de ExtJS, tiene más sentido usar '' Ext.override' o Ext.extend' en lugar de cambiar el prototipo. – NT3RP

+0

Nicholas T es correcto ... Usamos Ext.override dentro de nuestro componente de red extendida en nuestro caso. –

+0

Gracias. Estoy usando 3.2.0 así que tuve que hacer algunos cambios. Saludos – user427969

6

Para 3.2.0 tuve que reemplazar la función createSortFunction de la siguiente manera:

Ext.override(Ext.data.Store, { 
// override 
createSortFunction : function(field, direction) { 
    direction = direction || "ASC"; 
    var directionModifier = direction.toUpperCase() == "DESC" ? -1 : 1; 
    var sortType = this.fields.get(field).sortType; 

    //create a comparison function. Takes 2 records, returns 1 if record 1 is greater, 
    //-1 if record 2 is greater or 0 if they are equal 
    return function(r1, r2) { 
     var v1 = sortType(r1.data[field]), 
      v2 = sortType(r2.data[field]); 

     // To perform case insensitive sort 
     if (v1.toLowerCase) { 
      v1 = v1.toLowerCase(); 
      v2 = v2.toLowerCase(); 
     } 

     return directionModifier * (v1 > v2 ? 1 : (v1 < v2 ? -1 : 0)); 
    }; 
} 
}); 

Espero que esto ayude a alguien.

19

he encontrado una manera mucho más simple

usando ExtJS 3.3.1, probablemente trabaja con anteriormente también.

Basta con definir la SortType para el campo como asUCString, así:

new Ext.data.JsonStore({ 
    url: 'my.php', 
    fields: [{name:'name', sortType:Ext.data.SortTypes.asUCString}], 
    sortInfo: { field: 'name', direction: 'ASC'} 
}); 
+0

Gracias @Duncan, la tuya es la manera correcta de hacerlo, supongo. Es solo que tengo tantas cajas combinadas en mi aplicación y no quiero agregar manualmente el tipo de ordenación a todas ellas, así que preferiría el método de anulación. Gracias de nuevo. Saludos – user427969

5

transformada: function (idioma) {return displayName.toLowerCase(); }

store: 
    fields:   ['value', 'displayName'], 
    data:   [], 
    sorters: [{ 
     property: 'displayName', 
     direction: 'ASC', 
     transform: function (displayName) { return displayName.toLowerCase(); } 
    }] 
+0

Esta es definitivamente la respuesta para al menos ExtJS 4 y 5. –

Cuestiones relacionadas