2013-07-22 30 views
5

Mam siatkę w ext z pewnymi niestandardowymi kolumnami i chcę mieć możliwość sortowania tej kolumny - chcę ją posortować według tego, co jest w niej wyświetlane, ale tak naprawdę po prostu nie mogę dowiedzieć się, jak zdefiniować sorter dla kolumny, która nie będzie oparta na dataIndex - próbowałem użyć niestandardowego modelu, ale nie mogłem tego zrobić.Ext js sortowanie kolumny niestandardowej według zawartości

{ 
    text: 'Parent', 
    dataIndex: 'Parent', 
    renderer: function(value, meta, record) { 
     var ret = record.raw.Parent; 
     if (ret) { 
      return ret.Name; 
     } else { 
      meta.tdCls = 'invisible'; 
      return record.data.Name; 
     } 
    }, 
    sortable: true 
}, 
+0

Myślę, że powodem żadne z tych rozwiązań pracował w moim przypadku, bo jest korzystał ze sklepu Pageable, a nie z Ext.data.Store. Dziękuję wam obojgu, wasze rozwiązania działają zarówno przy korzystaniu z Ext.data.Store. –

Odpowiedz

4

Powinieneś być w stanie zastąpić metodę doSort kolumny. Oto sedno tego. Stworzyłem także działające skrzypce (http://jsfiddle.net/cfarmerga/LG5uA/). Skrzypce używa długości ciągu pola jako właściwości do sortowania, ale oczywiście można zastosować własną niestandardową logikę sortowania.

var grid = Ext.create('Ext.grid.Panel',{ 
    //... 
    columns: [ 
     { text: 'name', dataIndex: 'name', sortable: true }, 
     { 
      text: 'Custom', 
      sortable : true, 
      dataIndex: 'customsort', 
      doSort: function(state) { 
       var ds = this.up('grid').getStore(); 
       var field = this.getSortParam(); 
       ds.sort({ 
        property: field, 
        direction: state, 
        sorterFn: function(v1, v2){ 
         v1 = v1.get(field); 
         v2 = v2.get(field); 
         return v1.length > v2.length ? 1 : (v1.length < v2.length ? -1 : 0); 
        } 
       }); 
      } 
     } 
    ] 
    //.... 
}); 
+0

Ustawiam blok kodu, który podałeś, a kiedy nie zadziałał, uruchomił konsolę rejestrując różne zmienne, aby upewnić się, że otrzymałem poprawną odpowiedź. Kiedy klikam kolumnę do sortowania, poprawnie wywołuje metodę doSort. Jednak żadne z dzienników konsoli, które umieszczam w metodzie 'ds.sort();' nigdy nie zostało uruchomione, więc stwierdzam, że ta metoda nigdy nie została uruchomiona. Masz pojęcie, co się tutaj dzieje? Ponadto, zgodnie z dokumentami API, nie powinno to być 'ds.sort ([{property ...}]);' –

+0

Nie jestem pewien w jaki sposób będziesz dodawać wywołania console.log w 'ds.sort 'metoda, ponieważ nie nadpisujesz tej metody. Właśnie dodałem 'console.log' do funkcji' sorterFn' i zostanie on wywołany pomyślnie. –

+0

Przepraszam, chciałem to powiedzieć. Mam 'sorterFn: function (one, two) { console.log ('jeden', jeden); console.log ("dwa", dwa); one = one.get (field); two = two.get (field); return v1.length> v2.length? 1: (v1.length

2

Istnieje metoda konwersji w klasie Ext.data.Model, która umożliwia konwertowanie danych przed ich użyciem. Następnie możesz po prostu określić ten "dataIndex" w swojej kolumnie i zrobić zwykły sort. Kolumna zostanie posortowana według tej skonwertowanej wartości. Oto przykładowy model z tylko jednym polu (jednostka dominująca) i to odpowiada konwersji:

Ext.define('MyModel', { 
    extend: 'Ext.data.Model', 
    fields: [ 
     {name: 'Parent', type: 'string', convert: sortParent}, 
     // other fields... 
    ], 
    sortParent: function(value, record) { 
     var ret = record.raw.Parent; 
     if (ret) { 
      return ret.Name; 
     } else { 
      meta.tdCls = 'invisible'; 
      return record.data.Name; 
     } 
    } 
}); 
+0

Próbowałem tego podejścia, ale nie udało mi się go uruchomić.Nie widzę metody convert i nie jestem pewien, od którego metody wywoływać metodę sortParent. –

+0

Spójrz na to skrzypce: http://jsfiddle.net/LG5uA/7/ –

+1

@JuanDanielFlores - twój przykład działa poprawnie z alternatywnymi danymi w miejscu, ale jak pierwotnie napisano, sortowanie skrzypiec jest takie samo pomiędzy dwiema kolumnami. http://jsfiddle.net/LG5uA/57/ daje lepszą demonstrację działania. –

3

Dla Ext JS wersji 5, wygląda doSort wyjęto, więc nie mogła przesłonić tego. Zamiast tego poszedłem na trasę słuchania zdarzenia sortchange, a następnie skorzystałem z metody Ext.data.Store.setSorters. Kod jest zwyczaj nieco, i zbyt skomplikowane ze względu na dane, które używam, więc miej to na uwadze (Fiddle here):

// grid class 
initComponent: function() { 
    ... 
    this.on('sortchange', this.onSortChange, this); 
}, 

onSortChange: function(container, column, direction, eOpts) { 
    // check for dayColumnIndex 
    if (column && column.dayColumnIndex !== undefined) { 
    this.sortColumnByIndex(column.dayColumnIndex, direction); 
    } 
}, 

sortColumnByIndex: function(columnIndex, direction) { 
    var store = this.getStore(); 
    if (store) { 
    var sorterFn = function(rec1, rec2) { 
     var sortValue = false; 
     if (rec1 && rec2) { 
     var day1; 
     var daysStore1 = rec1.getDaysStore(); 
     if (daysStore1) { 
      day1 = daysStore1.getAt(columnIndex); 
     } 
     var day2; 
     var daysStore2 = rec2.getDaysStore(); 
     if (daysStore2) { 
      day2 = daysStore2.getAt(columnIndex); 
     } 
     if (day1 && day2) { 
      var val1 = day1.get('value'); 
      var val2 = day2.get('value'); 
      sortValue = val1 > val2 ? 1 : val1 === val2 ? 0 : -1; 
     } 
     } 
     return sortValue; 
    }; 
    if (direction !== 'ASC') { 
     sorterFn = function(rec1, rec2) { 
     var sortValue = false; 
     if (rec1 && rec2) { 
      var day1; 
      var daysStore1 = rec1.getDaysStore(); 
      if (daysStore1) { 
      day1 = daysStore1.getAt(columnIndex); 
      } 
      var day2; 
      var daysStore2 = rec2.getDaysStore(); 
      if (daysStore2) { 
      day2 = daysStore2.getAt(columnIndex); 
      } 
      if (day1 && day2) { 
      var val1 = day1.get('value'); 
      var val2 = day2.get('value'); 
      sortValue = val1 < val2 ? 1 : val1 === val2 ? 0 : -1; 
      } 
     } 
     return sortValue; 
     }; 
    } 
    store.setSorters([{ 
     sorterFn: sorterFn 
    }]); 
    } 
} 
+0

http://stackoverflow.com/a/25202392/1684254 Prywatna metoda doSort została zastąpiona metodą sortowania opisaną powyżej. –