2013-07-22 48 views
5

Tôi có một lưới mở rộng với một số cột tùy chỉnh và tôi muốn có thể sắp xếp cột này - Tôi muốn sắp xếp theo thứ được hiển thị bên trong, nhưng thực sự tôi không thể tìm ra cách để xác định một bộ sắp xếp cho một cột sẽ không dựa trên dataIndex - Tôi đã thử sử dụng một mô hình tùy chỉnh, nhưng tôi không thể làm điều đó để làm việc.Ext js sắp xếp cột tùy chỉnh theo nội dung

{ 
    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

Tôi nghĩ lý do không có giải pháp làm việc trong trường hợp của tôi là vì tôi đang sử dụng Cửa hàng có thể chia sẻ, thay vì sử dụng Ext.data.Store. Cảm ơn cả hai, các giải pháp của bạn đều hoạt động khi sử dụng Ext.data.Store. –

Trả lời

4

Bạn sẽ có thể ghi đè phương pháp doSort của cột. Đây là ý chính của nó. Tôi cũng tạo ra một fiddle làm việc (http://jsfiddle.net/cfarmerga/LG5uA/). Fiddle sử dụng độ dài chuỗi của một trường làm thuộc tính để sắp xếp, nhưng tất nhiên bạn có thể áp dụng logic sắp xếp tùy chỉnh của riêng bạn.

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

Tôi thiết lập khối mã bạn đã nêu và khi nó không hoạt động, bắt đầu điều khiển ghi nhật ký các biến khác nhau để đảm bảo tôi đã nhận được đúng thứ. Khi tôi nhấp vào cột để sắp xếp, nó sẽ gọi phương thức doSort một cách chính xác. Tuy nhiên, không có bản ghi bàn điều khiển nào tôi đưa vào phương thức 'ds.sort();' đã từng chạy, vì vậy tôi kết luận rằng phương thức đó không bao giờ chạy. Bất kỳ ý tưởng gì đang xảy ra ở đây? Ngoài ra, theo tài liệu API, không nên là 'ds.sort ([{property ...}]); ' –

+0

Tôi không chắc chắn cách bạn sẽ thêm các cuộc gọi console.log trong' ds.sort 'phương pháp kể từ khi bạn không ghi đè phương pháp đó. Tôi vừa thêm 'console.log' vào hàm' sorterFn' và nó được gọi thành công. –

+0

Xin lỗi, đó là điều tôi muốn nói. Tôi có 'sorterFn: function (một, hai) { console.log ('một', một); console.log ('hai', hai); one = one.get (field); hai = hai.get (trường); trả về v1.length> v2.length? 1: (v1.length

2

Có phương thức chuyển đổi trên lớp Ext.data.Model cho phép bạn chuyển đổi dữ liệu trước khi sử dụng. Sau đó, bạn chỉ có thể chỉ định 'dataIndex' này trong cột của bạn và thực hiện sắp xếp bình thường. Cột sẽ được sắp xếp theo giá trị được chuyển đổi đó. Đây là một mô hình mẫu chỉ với một lĩnh vực (mẹ) và với nó chuyển đổi tương ứng:

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

Tôi đã thử cách tiếp cận này, nhưng tôi đã không làm cho nó hoạt động được.Tôi không thấy phương thức chuyển đổi, và tôi không chắc chắn nên gọi phương thức sortParent từ đâu. –

+0

Hãy xem fiddle này: http://jsfiddle.net/LG5uA/7/ –

+1

@JuanDanielFlores - ví dụ của bạn hoạt động chính xác với dữ liệu thay thế tại chỗ, nhưng như được đăng lần đầu, phân loại của fiddle giống nhau giữa hai cột. http://jsfiddle.net/LG5uA/57/ cung cấp cho một cuộc biểu tình tốt hơn về nó hoạt động. –

3

Đối Ext JS phiên bản 5, có vẻ như doSort đã được đưa ra, vì vậy tôi không thể ghi đè lên đó. Thay vào đó, tôi đã đi theo con đường lắng nghe sự kiện sortchange và từ đó, tôi đã sử dụng phương thức Ext.data.Store.setSorters. Mã này là một phong tục bit, và quá phức tạp vì các dữ liệu mà tôi đang sử dụng, vì vậy giữ cho rằng trong tâm trí (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 Phương thức doSort riêng tư đã được thay thế bằng phương pháp sắp xếp như được thảo luận trong bài đăng ở trên. –

Các vấn đề liên quan