Магазин с пользовательской сортировкой в ​​Sencha Touch - PullRequest
4 голосов
/ 14 апреля 2011

У меня есть магазин + модель, которая подключена к стороннему плагину (Ext.ux.TouchGridPanel). Плагин правильно вызывает метод store () магазина с соответствующим отображением. Все работает нормально, и магазин сортирует сам. Однако я бы предпочел добавить сортировку клиентов в магазин. Я попытался добавить поле sortType в мою модель:

Ext.regModel("Transactions", {
    fields: [
        {
            name: 'unit',
            type: 'string',
            sortType: function(value) {
                console.log('PRINT GDAMNIT');
                return 0;
            }
        },

        ...

    ]
});

Это, однако, не работает, и sortType не вызывается.

TLDR: Как заставить пользовательскую сортировку работать для магазинов?

Ответы [ 4 ]

6 голосов
/ 14 апреля 2011

Вашему магазину понадобится добавленный сортировщик, который будет сортировать по этому полю перед вызовом функции sortType.

var store = new Ext.data.Store({ 
   model: 'Transactions',
   sorters: [
      {
        property: 'unit',
        direction: 'DESC'
      }
   ]}
);

Тип сортировки преобразует значение поля в другое значениедля обеспечения правильного заказа.Если вы не сортируете это поле, то нет причин вызывать эту функцию.Вы можете добавить sortDir к полю, который будет сортировать поле в порядке возрастания / убывания, основываясь только на типе поля.

2 голосов
/ 22 марта 2012

Пользовательский SortType в Sencha Touch 2 работает соответственно в соответствии с http://docs.sencha.com/touch/2-0/#!/api/Ext.data.SortTypes:

Ext.apply(Ext.data.SortTypes, {
    asPerson: function(person){
        // expects an object with a first and last name property
        return person.lastName.toUpperCase() + person.firstName.toLowerCase();
    }
});

Ext.define('Employee', {
    extend: 'Ext.data.Model',
    config: {
        fields: [{
            name: 'person',
            sortType: 'asPerson'
        }, {
            name: 'salary',
            type: 'float' // sortType set to asFloat
        }]
    }
});
2 голосов
/ 01 ноября 2011

Обходным путем может быть (я знаю, это звучит неэффективно, но терпите меня) добавить дополнительное поле к экземплярам вашей модели (давайте назовем его sortField) и использовать его для функции сортировки.Затем вы можете перебрать экземпляры вашей модели в вашем магазине, применяя ваш собственный алгоритм сортировки, и назначить значение сортировки 0,1,2,3,4,5 и т. Д. Для sortField.Затем в вашем магазине вы можете добавить 'sorters: 'sortField' ... Надеюсь, это немного поможет, сейчас я прохожу нечто подобное.

1 голос
/ 14 апреля 2011

То, что вы пытаетесь сделать, может быть хитрым.Вызов store.sort() удаляет все существующие сортировщики по умолчанию (согласно документации Sencha Touch API ).Чтобы сохранить существующие сортировщики, вам нужно добавить сортировщик в MixedCollection store.sorters.

Во-вторых, чтобы вызвать метод сортировки с пользовательской функцией сортировки, вам нужно будет передать определенный sorterFnвместо property до Sorter (опять же, см. API для получения более подробной информации) - но это может оказаться сложным, поскольку вызов сортировки инициируется из плагина.

Не уверенесли это поможет решить вашу проблему, но, возможно, поможет вам взглянуть в правильном направлении.

...