我有一个商店+模型,它连接到第三方插件(Ext.ux.TouchGridPanel)。该插件使用相关映射正确调用商店的sort()方法。一切都很好,商店自己排序。但是,我更愿意在商店中添加客户排序。我尝试在我的模型中添加sortType字段:
Ext.regModel("Transactions", {
fields: [
{
name: 'unit',
type: 'string',
sortType: function(value) {
console.log('PRINT GDAMNIT');
return 0;
}
},
...
]
});
然而,这不起作用,并且不会调用sortType。
TLDR:如何为商店进行自定义排序?
答案 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更多细节) - 但这可能会很棘手,因为排序调用是从插件启动的。
不确定这是否有助于解决您的问题,但也许它可以帮助您找到正确的方向。