在Sencha Touch中存储自定义排序

时间:2011-04-14 08:03:17

标签: sorting sencha-touch extjs

我有一个商店+模型,它连接到第三方插件(Ext.ux.TouchGridPanel)。该插件使用相关映射正确调用商店的sort()方法。一切都很好,商店自己排序。但是,我更愿意在商店中添加客户排序。我尝试在我的模型中添加sortType字段:

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

        ...

    ]
});

然而,这不起作用,并且不会调用sortType。

TLDR:如何为商店进行自定义排序?

4 个答案:

答案 0 :(得分:6)

您的商店需要添加一个分拣机,在调用sortType函数之前对该字段进行排序。

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

Sort type将字段的值转换为另一个值以确保正确排序。如果您没有对该字段进行排序,则没有理由调用该函数。您可以将sortDir添加到字段中,该字段将根据字段的类型将字段排序为升序/降序。

答案 1 :(得分:2)

一种解决方法可能是(我知道这听起来效率低下,但请耐心等待)为模型实例添加一个额外的字段(让我们称之为sortField)并将其用于排序功能。然后,您可以应用自定义排序算法遍历商店中的模型实例,并为sortField分配排序值0,1,2,3,4,5等。然后在你的商店,你可以添加'sorters: 'sortField' ...希望这有点帮助,我现在正在经历类似的事情。

答案 2 :(得分:2)

根据http://docs.sencha.com/touch/2-0/#!/api/Ext.data.SortTypes,Sencha Touch 2中的自定义SortType 可以正常工作:

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

答案 3 :(得分:1)

你试图做的事可能很棘手。默认情况下,调用store.sort()会删除所有现有的分拣机(根据Sencha Touch API documentation)。要保留现有的分拣机,您需要将分拣机添加到MixedCollection store.sorters

其次,要使用自定义排序函数调用sort方法,您需要将特定sorterFn而不是property传递给Sorter(再次,请参阅{{3更多细节) - 但这可能会很棘手,因为排序调用是从插件启动的。

不确定这是否有助于解决您的问题,但也许它可以帮助您找到正确的方向。