我想知道如何使存储排序器忽略名称的第一个字母是小的还是大写的?我希望将首字母相同的列表项组合在一起,或者至少将小写首字母放在大写字母下面,而不是像最初那样先有一个大写名称列表,然后是小写首字母列表。
我找到了类似
的东西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();
可能是有用的
谢谢!
编辑:这似乎工作:
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);
根据Ext.util.Sorter类中定义的'defaultSorterFn',您可以将其更改为始终以小写(或大写)比较值
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();
只是让你知道,这是完全未经测试的。:)
对我来说,最好的解决方案似乎是在模型中放置另一个属性,并使用它从商店对其进行分组和排序,如下所示:
//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];
}
});