extjs - сортировка в алфавитно-цифровом и регистрозависимом формате - PullRequest
6 голосов
/ 30 марта 2011

Я хочу отсортировать хранилище (ArrayStore и GroupingStore) в алфавитно-числовом формате и регистре НЕНЕССИВНО. Я использую метод singleSort (), но он чувствителен к регистру.

Например,

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

Есть предложения о том, как этого добиться?

Ответы [ 4 ]

19 голосов
/ 29 февраля 2012

Я нашел гораздо более простой способ

с использованием ExtJS 3.3.1, возможно, работает и с более ранними версиями.

Просто определите sortType для поля как asUCString, например:

new Ext.data.JsonStore({ 
   url: 'my.php', 
   fields: [{name:'name', sortType:Ext.data.SortTypes.asUCString}], 
   sortInfo: { field: 'name', direction: 'ASC'} 
});
6 голосов
/ 12 апреля 2011

Для 3.2.0 мне пришлось переопределить функцию createSortFunction следующим образом:

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

Надеюсь, это кому-нибудь поможет.

6 голосов
/ 30 марта 2011

Добавьте это в свой код ... будьте осторожны с вашими областями, потому что вы будете делать все виды на странице нечувствительными к регистру.Я нашел этот код на форумах и успешно использовал его в 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);
}

}

5 голосов
/ 02 июля 2015

transform: function (displayName) {return displayName.toLowerCase ();}

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