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에서 코드를 테스트하고 문제없이 작동

.