2016-12-28 149 views
2

我想重用商店的分拣机来创建比较函数来对数组进行排序。下面是我简化了代码:使用Ext.util.Sortable对数组进行排序

// 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进行排序?

或者,有没有可能是一个补丁,我可以申请吗?

回答

2

它在ExtJS的5.1.1及更早版本的问题。添加此重写为Sortable.js进行固定的范围相关的BUG,即在for循环替换thissorters[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和它的作品没有问题。