ExtJS 5.0 - 覆盖以在网格列上提供自定义排序
ExtJS 5.0 - override to provide custom ordering on a grid column
网格控制列基于 name
排序,name
是 first + ' ' + last
的组合字段。客户想在 last + ', ' + first
之前订购。我不允许更改现有代码,只能使用覆盖。
根据网络搜索的结果,我认为使用 sortType
来转换输入值是侵入性最小的方法。但是不知道怎么插。
我认为 sortType
适用于数据字段,因此在 initComponent
重载中我可以访问我需要的内容吗?例如,这就是我在视图中重写以更改渲染的方式:
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;
};
}
我可以从这里访问 details.name
定义以覆盖 sortType
吗?我同意这 不是 最好的方法,因为我必须对 name
进行一些解析以将其拆分然后再将其粘在一起。对于那些有多个名字 and/or 的人来说,这会有问题。
另一种方法是重载 doSort
,但如果我无法访问 details.first
和 details.last
,它不会比 sortType
好多少.我看到一个实现 doSort
的例子,它看起来很复杂。有谁知道 doSort
的一些详细文档?
很难给出一些代码或存根,但我找到了一些关于排序的答案。据我所知,分机 4 在商店中有 sortType。所以你真正需要的是为你的商店创建自定义 sortType(如果你还没有创建一个商店)。
Ext 有办法在网格中排序东西,使用 initComponent 来处理其他东西。
sortType 看起来像 this
问题是sortType不取整条记录,直接作用于columns[0].dataIndex
,没有任何干涉的可能。如果您确定名字结束和姓氏开始的位置,则只能使用字符串操作:
this.columns[0].sortType = function(value) {
var spl = value.split(' ');
return value[1] + ', ' + value[0];
}
当然这会 运行 出现 "Carl Friedrich Theodor Wilhelm Freiherr von und zu Guttenberg" 等名称的问题,甚至 "George W. Bush" 也会成为问题。
更好的方法是在模型中引入另一个字段,类似于
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"
、放弃渲染器更改,并获得有用的排序。
网格控制列基于 name
排序,name
是 first + ' ' + last
的组合字段。客户想在 last + ', ' + first
之前订购。我不允许更改现有代码,只能使用覆盖。
根据网络搜索的结果,我认为使用 sortType
来转换输入值是侵入性最小的方法。但是不知道怎么插。
我认为 sortType
适用于数据字段,因此在 initComponent
重载中我可以访问我需要的内容吗?例如,这就是我在视图中重写以更改渲染的方式:
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;
};
}
我可以从这里访问 details.name
定义以覆盖 sortType
吗?我同意这 不是 最好的方法,因为我必须对 name
进行一些解析以将其拆分然后再将其粘在一起。对于那些有多个名字 and/or 的人来说,这会有问题。
另一种方法是重载 doSort
,但如果我无法访问 details.first
和 details.last
,它不会比 sortType
好多少.我看到一个实现 doSort
的例子,它看起来很复杂。有谁知道 doSort
的一些详细文档?
很难给出一些代码或存根,但我找到了一些关于排序的答案。据我所知,分机 4 在商店中有 sortType。所以你真正需要的是为你的商店创建自定义 sortType(如果你还没有创建一个商店)。
Ext 有办法在网格中排序东西,使用 initComponent 来处理其他东西。
sortType 看起来像 this
问题是sortType不取整条记录,直接作用于columns[0].dataIndex
,没有任何干涉的可能。如果您确定名字结束和姓氏开始的位置,则只能使用字符串操作:
this.columns[0].sortType = function(value) {
var spl = value.split(' ');
return value[1] + ', ' + value[0];
}
当然这会 运行 出现 "Carl Friedrich Theodor Wilhelm Freiherr von und zu Guttenberg" 等名称的问题,甚至 "George W. Bush" 也会成为问题。
更好的方法是在模型中引入另一个字段,类似于
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"
、放弃渲染器更改,并获得有用的排序。