使用 Ext.util.Sortable 对数组进行排序
Using Ext.util.Sortable to sort an array
我想重复使用商店的排序器来创建比较函数来对数组进行排序。这是我简化的代码:
// Data to sort
var data = [
{rank: 2, name: 'Zebra'},
{rank: 2, name: 'Aardvark'},
{rank: 1, name: 'Lion'}
];
// Sort by rank, then by name, case-insensitive
var sorters = [
{property: 'rank'},
{property: 'name', transform: function(x) {return x.toLowerCase();}}
];
// Will need this
var util = Ext.create('Ext.util.Sortable');
// Normalize the sorters
var decoded = util.decodeSorters(sorters);
// Create a comparator
var comparator = util.createComparator(decoded);
// Sort the data using the comparator
// *** fails here in ExtJS 5 ***
Ext.Array.sort(data, comparator);
// Output
Ext.Msg.alert('Success', JSON.stringify(data));
它失败的地方,它说 this.sorterFn is not a function
在几层排序相关函数的深处。确认以上内容在 ExtJS 6 中完美运行。
花了很长时间才达到这一点,所以在我进入较低级别之前,有没有更简单的方法来做到这一点?也就是说,重用 sorters
,用于数据存储,对 data
?
进行排序
或者,是否有我可以应用的补丁?
这是 ExtJS 5.1.1 及更早版本中的一个问题。将此覆盖添加为 Sortable.js
,它修复了与范围相关的错误,即在 for
循环中将 this
替换为 sorters[i]
:
Ext.define('Ext.overrides.util.Sortable', {
override: 'Ext.util.Sortable',
createComparator: function(sorters) {
return sorters && sorters.length ? function(r1, r2) {
var result = sorters[0].sort(r1, r2),
length = sorters.length,
i = 1;
for (; !result && i < length; i++) {
result = sorters[i].sort.call(sorters[i], r1, r2);
}
return result;
}: function() {
return 0;
};
}
});
在 ExtJS 5.0 和 5.1.0 中测试了您的代码,它可以正常工作。
我想重复使用商店的排序器来创建比较函数来对数组进行排序。这是我简化的代码:
// Data to sort
var data = [
{rank: 2, name: 'Zebra'},
{rank: 2, name: 'Aardvark'},
{rank: 1, name: 'Lion'}
];
// Sort by rank, then by name, case-insensitive
var sorters = [
{property: 'rank'},
{property: 'name', transform: function(x) {return x.toLowerCase();}}
];
// Will need this
var util = Ext.create('Ext.util.Sortable');
// Normalize the sorters
var decoded = util.decodeSorters(sorters);
// Create a comparator
var comparator = util.createComparator(decoded);
// Sort the data using the comparator
// *** fails here in ExtJS 5 ***
Ext.Array.sort(data, comparator);
// Output
Ext.Msg.alert('Success', JSON.stringify(data));
它失败的地方,它说 this.sorterFn is not a function
在几层排序相关函数的深处。确认以上内容在 ExtJS 6 中完美运行。
花了很长时间才达到这一点,所以在我进入较低级别之前,有没有更简单的方法来做到这一点?也就是说,重用 sorters
,用于数据存储,对 data
?
或者,是否有我可以应用的补丁?
这是 ExtJS 5.1.1 及更早版本中的一个问题。将此覆盖添加为 Sortable.js
,它修复了与范围相关的错误,即在 for
循环中将 this
替换为 sorters[i]
:
Ext.define('Ext.overrides.util.Sortable', {
override: 'Ext.util.Sortable',
createComparator: function(sorters) {
return sorters && sorters.length ? function(r1, r2) {
var result = sorters[0].sort(r1, r2),
length = sorters.length,
i = 1;
for (; !result && i < length; i++) {
result = sorters[i].sort.call(sorters[i], r1, r2);
}
return result;
}: function() {
return 0;
};
}
});
在 ExtJS 5.0 和 5.1.0 中测试了您的代码,它可以正常工作。