Sencha Touch :: как сделать сортировку магазина игнорировать, если первая буква маленькая или заглавная - PullRequest
1 голос
/ 13 июля 2011

Интересно, как заставить сортировщики магазина игнорировать, если первая буква имени маленькая или заглавная? Я хочу, чтобы элементы списка с одной и той же первой буквой были сгруппированы вместе или, по крайней мере, иметь маленькую первую букву под заглавными буквами, и не так, как если бы изначально сначала был список с заглавными буквами и после списка маленьких первых букв.

Я нашел что-то вроде

var sorter = new Ext.util.Sorter({
     property : 'myField',
     sorterFn: function(o1, o2) { // compare o1 and o2 } 
});

var store = new Ext.data.Store({
     model: 'myModel',
     sorters: [sorter] 
});

store.sort();

, что может быть полезно.

спасибо!

edit: похоже, работает:

var mySubStore = app.stores.myStore.findRecord('id', recordID).websites();               
    app.stores.myStore.findRecord('id', recordID).websites().getGroupString =  function(instance) {
        return instance.get('name')[0].toUpperCase();
    };

var sorter = new Ext.util.Sorter({
     property : 'name',
     sorterFn: function(o1, o2) {
        var v1 = this.getRoot(o1).get(this.property).toLowerCase(),
            v2 = this.getRoot(o2).get(this.property).toLowerCase();
        return v1 > v2 ? 1 : (v1 < v2 ? -1 : 0);
     },
    clear: function(){}
});
//mySubStore.sorters = [sorter];
mySubStore.sort(sorter);

Ответы [ 2 ]

3 голосов
/ 13 июля 2011

На основе 'defaultSorterFn', определенного в классе Ext.util.Sorter, вы можете просто изменить его, чтобы всегда сравнивать значения как строчные (или прописные)

var sorter = new Ext.util.Sorter({
     property : 'myField',
     sorterFn: function(o1, o2) {
        var v1 = this.getRoot(o1).get(this.property).toLowerCase(),
            v2 = this.getRoot(o2).get(this.property).toLowerCase(); 

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

var store = new Ext.data.Store({
     model: 'myModel',
     sorters: [sorter] 
});

store.sort();

Просто чтобы вы знали, этополностью не проверено.:)

2 голосов
/ 04 октября 2011

Мне кажется, что лучшим решением было бы добавить другое свойство в модель и использовать его из магазина для группировки и сортировки следующим образом:

//Model
Person = Ext.regModel('Person',
{
  fields:
  [
    {name: 'id', type:'int'},
    {name: 'name', type:'string'},
    {
      name: 'sortAndGroupName',
      convert: function(value, record)
      {
        return record.get('name').toUpperCase();
      }
    }
   ]
});

//Store
PersonStore = Ext.regStore('PersonStore',
{
  model: 'Person',
  sorters: [{ property: 'sortAndGroupName', direction: 'ASC'}],
  getGroupString : function(record)
  {
    return record.get('sortAndGroupName')[0];
  }
});
...