extjs – Sorta di archivio in ordine alfabetico e / minuscole

Voglio sorta di archivio (ArrayStore e GroupingStore) in ordine alfabetico e /minuscole. Sto usando singleSort() metodo, ma si ordina il caso in modo sensibile.

Per esempio,

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

Qualche suggerimento su come realizzare questo?

OriginaleL’autore user427969 | 2011-03-29

4 Replies
  1. 6

    Aggiungere questo al tuo codice… diffidare del tuo ambiti perché si farà di tutti i tipi sulla pagina distinzione tra maiuscole e minuscole. Ho trovato questo codice sul forum e lo hanno utilizzato con successo in 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);
    }

    }

    Quando ha a che fare con ExtJS, ha più senso utilizzare Ext.override o Ext.extend piuttosto che cambiare il prototipo.
    Nicola T è corretto… Abbiamo usato Ext.override all’interno della nostra griglia estesa componente nel nostro caso.
    Grazie. Sto usando 3.2.0 così ho dovuto apportare alcune modifiche. Saluti

    OriginaleL’autore It Grunt

  2. 19

    Ho trovato un modo molto più semplice

    utilizzando ExtJS 3.3.1, probabilmente funziona con le versioni precedenti.

    Semplicemente definire il sortType per il campo come asUCString, come questo:

    new Ext.data.JsonStore({ 
       url: 'my.php', 
       fields: [{name:'name', sortType:Ext.data.SortTypes.asUCString}], 
       sortInfo: { field: 'name', direction: 'ASC'} 
    });
    Grazie @Duncan, il tuo è il modo giusto per farlo, credo. Solo che ho tante combobox nella mia applicazione e non voglio aggiungere manualmente il sorttype a tutti preferisco il metodo di sostituzione. Grazie di nuovo. Saluti

    OriginaleL’autore Duncan

  3. 6

    Per 3.2.0 ho dovuto sovrascrivere createSortFunction funzione come segue:

    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));
        };
    } 
    });

    Spero che questo aiuta qualcuno.

    OriginaleL’autore user427969

  4. 5

    trasformare: funzione (displayName) { return displayName.toLowerCase(); }

    store:
       fields:         ['value', 'displayName'],
       data:           [],
       sorters: [{
           property:   'displayName',
           direction:  'ASC',
           transform:  function (displayName) { return displayName.toLowerCase(); }
       }]
    Questa è sicuramente la risposta per almeno ExtJS 4 e 5.

    OriginaleL’autore Nazar Vynnytskyi

Lascia un commento