网格控制列是基于name
的顺序排序的,而first + ' ' + last
是last + ', ' + first
的组合字段。客户想按sortType
订购。我不允许更改现有代码,只能使用替代。
根据网络搜索的结果,我认为使用sortType
转换输入值是最少的侵入方法。但我不确定如何插入。
我认为initComponent
适用于数据字段,因此在details.name
重载中我可以访问所需的内容吗?例如,这就是我在视图中重写以更改渲染的方式:
initComponent: function() {
this.callParent([]);
this.columns[0].renderer =
function(value, metaData, record, rowIdx, colIdx, store, view) {
var result = '';
if (!Ext.isEmpty(record.data) && !Ext.isEmpty(record.data.details)) {
var details = record.data.details;
// value == details.name is 'first last', won't be using that
result = details.last + ', ' + details.first;
}
return result;
};
}
我可以从此处访问
sortType
定义以覆盖name
吗?会同意这不是最好的方法,因为我必须对doSort
进行一些解析以将其拆分,然后将其重新粘贴在一起。对于拥有多个名字和/或姓氏的人来说,这将是一个问题。另一种方法是使
details.first
重载,但是如果我没有访问details.last
和sortType
的权限,那就不会比doSort
好。我看到了一个实现doSort
的示例,它看起来非常复杂。有人知道的一些详细文档吗? 最佳答案
问题是sortType不能获取整个记录,而是直接应用于columns[0].dataIndex
,没有任何可能的干扰。而且,只有在确定名字的结尾和姓氏的开头时,才可以使用字符串操作:
this.columns[0].sortType = function(value) {
var spl = value.split(' ');
return value[1] + ', ' + value[0];
}
当然,这将遇到诸如“卡尔·弗里德里希·西奥多·威廉·弗莱厄尔·冯·祖·古腾堡”之类的名字的问题,甚至“乔治·W·布什”也将是一个问题。
更好的方法是将另一个字段引入模型,类似于
MyApp.model.Resource.getFields().push(Ext.create('Ext.data.Field',{
name:"LastFirst",
convert:function(v,rec) {
return rec.get("last")+', '+rec.get("first")
}
}));
此更改不会影响现有的模型实例,因此您必须在创建任何模型实例之前执行此操作。
这将允许您设置
columns[0].dataIndex="LastFirst"
,取消渲染器更改并获得有用的排序。关于javascript - ExtJS 5.0-覆盖以在网格列上提供自定义排序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32251017/