最近發現如果dataIndex爲對象的column,column顯示內容是對象中某些屬性拼接出來的,則無法基於控件本身提供的默認升降序進行排序(我用的是extjs6)。
發現可以通過重寫column的sort函數來實現自定義升降序規則,這也適用於可以使用默認排序,但是因爲規則不同而想重寫的情況:
sort: function () {
var ds = this.up('grid').getStore();
var field = this.getSortParam();
var state = (this.sortState === null ? 'ASC' : (this.sortState === 'ASC' ? 'DESC' : 'ASC'));
ds.sort({
property: field,
direction: state,
sorterFn: function (v1, v2) {
v1 = v1.get(field);
v2 = v2.get(field);
return (v1.attr1 + v1.attr2).localeCompare(v2.attr1 + v2.attr2);
}
});
}
因爲我這是一個放在一個公共columnGrid中,所以獲取store的時候要先up下。
另外,this.getSortParam()是要拿到將要排序的column,也就是dataIndex的值,詳情可以看源碼。
還有,因爲剛開始沒有進行升降序,所以第一次拿到的sortState是null,要進行判斷並設置默認排序。而且下一次要給相反方向值。
之後重寫store對於這個field的排序規則,指定field,方向,和自定義排序規則。因爲屬性值都是string,所以這裏用了localeCompare。
有些思路來自於這裏:參考思路