2016-12-28 5 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, который фиксирует в области действия, связанные с ошибкой, а именно заменяет this с sorters[i] в петле for:

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, и она работает без проблем.

Смежные вопросы