2011-03-29 60 views
6

我想按字母數字排序存儲(ArrayStore和GroupingStore),並且INSENSITIVELY情況。我正在使用singleSort()方法,但它排序大小寫敏感。extjs - 按字母數字排序存儲和不區分大小寫

例如,

data = ['c', '1', 'A', 'a', 'C'] 
output = ['1', 'A', 'C', 'a', 'c'] 
myoutput = ['1', 'a', 'A', 'c', 'C'] or [['1', 'A', 'a', 'C', 'c'] // This is what I want 

就如何實現這一目標的任何建議嗎?

回答

6

將此代碼添加到您的代碼中...請謹慎對待您的範圍,因爲您會使網頁上的所有內容不區分大小寫。我在論壇上找到了這個代碼,並在3.2.1中成功使用了它。

Ext.data.Store.prototype.sortData = function(f, direction){ 
direction = direction || 'ASC'; 
var st = this.fields.get(f).sortType; 
var fn = function(r1, r2) { 
    var v1 = st(r1.data[f]), v2 = st(r2.data[f]); 
    // ADDED THIS FOR CASE INSENSITIVE SORT 
    if (v1.toLowerCase) { 
     v1 = v1.toLowerCase(); 
     v2 = v2.toLowerCase(); 
    } 
    return v1 > v2 ? 1 : (v1 < v2 ? -1 : 0); 
}; 
this.data.sort(direction, fn); 
if (this.snapshot && this.snapshot != this.data) { 
    this.snapshot.sort(direction, fn); 
} 

}

+4

在處理ExtJS時,使用'Ext.override'或'Ext.extend'更有意義,而不是更改原型。 – NT3RP 2011-03-30 00:21:11

+0

Nicholas T是正確的......在我們的案例中,我們在擴展網格組件內使用了Ext.override。 – 2011-03-30 13:11:06

+0

謝謝。我使用3.2.0,所以我不得不做一些改變。問候 – user427969 2011-04-12 01:01:34

6

爲3.2.0,我不得不重寫createSortFunction功能如下:

Ext.override(Ext.data.Store, { 
// override 
createSortFunction : function(field, direction) { 
    direction = direction || "ASC"; 
    var directionModifier = direction.toUpperCase() == "DESC" ? -1 : 1; 
    var sortType = this.fields.get(field).sortType; 

    //create a comparison function. Takes 2 records, returns 1 if record 1 is greater, 
    //-1 if record 2 is greater or 0 if they are equal 
    return function(r1, r2) { 
     var v1 = sortType(r1.data[field]), 
      v2 = sortType(r2.data[field]); 

     // To perform case insensitive sort 
     if (v1.toLowerCase) { 
      v1 = v1.toLowerCase(); 
      v2 = v2.toLowerCase(); 
     } 

     return directionModifier * (v1 > v2 ? 1 : (v1 < v2 ? -1 : 0)); 
    }; 
} 
}); 

希望這可以幫助別人。

19

我發現使用ExtJS的3.3.1一個更簡單的方法

,可能與早期太的作品。

只需定義sortType的字段作爲asUCString,像這樣:

new Ext.data.JsonStore({ 
    url: 'my.php', 
    fields: [{name:'name', sortType:Ext.data.SortTypes.asUCString}], 
    sortInfo: { field: 'name', direction: 'ASC'} 
}); 
+0

謝謝@Duncan,我想你的方法是正確的。它只是,我有我的應用程序中有這麼多組合框,我不想手動將sorttype添加到所有它們,所以我更喜歡覆蓋方法。再次感謝。問候 – user427969 2012-08-10 04:30:23

5

變換:功能(顯示名){返回displayName.toLowerCase(); }

store: 
    fields:   ['value', 'displayName'], 
    data:   [], 
    sorters: [{ 
     property: 'displayName', 
     direction: 'ASC', 
     transform: function (displayName) { return displayName.toLowerCase(); } 
    }] 
+0

這絕對是至少ExtJS 4和5的答案。 – 2015-07-23 14:06:24

相關問題