2016-12-28 4 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としてこのオーバーライドを追加、すなわちforループでsorters[i]thisを置き換え:

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で、あなたのコードをテストし、それが問題なく動作します

関連する問題