ExtJS 5.0 - 覆盖以在网格列上提供自定义排序

ExtJS 5.0 - override to provide custom ordering on a grid column

网格控制列基于 name 排序,namefirst + ' ' + 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.firstdetails.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"、放弃渲染器更改,并获得有用的排序。