2013-07-22 12 views
5

Bazı özel sütunlarla birlikte bir kılavuzum var ve bu sütunu sıralamak istiyorum - bunun içinde görüntülenenlere göre sıralamak istiyorum, ama gerçekten yapamıyorum dataIndex temelli olmayan bir sütun için bir sıralayıcının nasıl tanımlanacağını anla - özel bir model kullanmayı denedim, ancak bunu işe alamadım.İçindekilerle özel sütunları sırala özel js

+0

: Kod biraz özel, çünkü ben kullanıyorum verilerin aşırı karmaşık, böylece akılda tutmak (Fiddle here) 'dir bir Ext.data.Store yerine bir Pageable Store kullanıyordu. İkinize de teşekkürler, çözümleriniz bir Ext.data.Store kullanırken çalışır. –

cevap

4

Sütunun doSort yöntemini geçersiz kılabilirsiniz. İşte onun özü. Ayrıca çalışan bir keman oluşturdum (http://jsfiddle.net/cfarmerga/LG5uA/). Keman, bir alanın dize uzunluğunu sıralama özelliği olarak kullanır, ancak elbette kendi özel sıralama mantığınızı uygulayabilirsiniz.

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

Belirttiğiniz kod bloğunu ayarlıyorum ve işe yaramazsa, doğru şeyi aldığımdan emin olmak için çeşitli değişkenleri günlüğe kaydetmesi için konsolu başlattım. Sıralanacak sütunu tıklattığımda doSort yöntemini doğru olarak çağırır. Ancak, 'ds.sort() 'yöntemine koyduğum konsol günlüklerinin hiçbiri hiç çalıştırılmadı, bu yüzden bu yöntemin hiç çalışmadığı sonucuna vardım. Burada neler olduğu hakkında bir fikrin var mı? Ayrıca, API belgelerine göre, ds.sort ([{özellik ...}] olmamalıdır; ' –

+0

' ds.sort'ta konsol.log çağrılarını nasıl ekleyeceğinizden emin değilim. yöntemi bu yöntemi geçersiz kılmıyorsunuz. Sadece 'sorterFn' işlevine' console.log' ekledim ve başarıyla çağrılıyor. –

+0

Üzgünüz, demek istediğim şey buydu. SorterFn: function (bir, iki) var { console.log ('one', one); console.log ('iki', iki); one = one.get (alan); iki = iki.get (alan); v1.length> v2.length değerini döndürüyor mu? 1: (v1.length

2

Kullanıldığı ediliyor önce verileri dönüştürmek için izin verir Ext.data.Model sınıfı bir dönüştürmek yöntemi yoktur. Ardından, sütundaki bu 'dataIndex' değerini belirtebilir ve normal bir sıralama yapabilirsiniz. Sütun, dönüştürülen değerle sıralanır. Aşağıda örnek bir sadece bir alan (Ana) model ve dönüşüm gelen oluyor ile geçerli:

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

Bu yaklaşımı denedim, ancak çalışmayı başaramadım.Dönüştürme yöntemini görmüyorum ve sortParent yöntemini nereden arandığından emin değilim. –

+0

Bu keman'a bir göz atın: http://jsfiddle.net/LG5uA/7/ –

+1

@JuanDanielFlores - örneğiniz yerine alternatif verilerle doğru şekilde çalışır, ancak orijinal olarak yayınlandığı gibi, kemanın sıralama iki sütun arasında aynıdır. http://jsfiddle.net/LG5uA/57/, çalışmasının daha iyi gösterilmesini sağlar. –

3

Ext JS sürümü 5 için, doSort çıkarıldı, bu yüzden bunu geçersiz olamazdı gibi görünüyor. Bunun yerine, sortchange olayını dinleme yoluna gittim ve oradan Ext.data.Store.setSorters yöntemini kullandım. ne bu çözümlerin benim durumumda çalıştı nedeni çünkü ben olduğunu düşünüyorum

// 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 THe private doSort yöntemi, yukarıdaki gibi ele alındığı gibi sıralama yöntemiyle değiştirilmiştir. –

İlgili konular