【问题标题】:extjs - Sort store alphanumerically and case insensitivelyextjs - 按字母数字排序存储,不区分大小写
【发布时间】:2011-07-25 16:19:10
【问题描述】:

我想按字母数字排序存储(ArrayStore 和 GroupingStore)并且不区分大小写。我正在使用 singleSort() 方法,但它区分大小写。

例如,

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

关于如何实现这一点的任何建议?

【问题讨论】:

    标签: extjs store


    【解决方案1】:

    我找到了一个更简单的方法

    使用 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'} 
    });
    

    【讨论】:

    • 谢谢@Duncan,我猜你的方法是正确的。只是我的应用程序中有很多组合框,我不想手动将排序类型添加到所有组合框,所以我更喜欢覆盖方法。再次感谢。问候
    【解决方案2】:

    将此添加到您的代码中...请注意您的范围,因为您将使页面上的所有内容不区分大小写。我在论坛上找到了这段代码,并在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);
    }
    

    }

    【讨论】:

    • 在处理 ExtJS 时,使用Ext.overrideExt.extend 比更改原型更有意义。
    • Nicholas T 是正确的...在我们的案例中,我们在扩展网格组件中使用了 Ext.override。
    • 谢谢。我正在使用 3.2.0,所以我不得不进行一些更改。问候
    【解决方案3】:

    对于 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));
        };
    } 
    });
    

    希望这对某人有所帮助。

    【讨论】:

      【解决方案4】:

      transform: function (displayName) { return displayName.toLowerCase(); }

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

      【讨论】:

      • 这绝对是至少 ExtJS 4 和 5 的答案。
      猜你喜欢
      • 2011-08-14
      • 1970-01-01
      • 2016-07-07
      • 2012-09-20
      • 2023-03-27
      • 2014-11-12
      • 2023-03-17
      • 2017-04-25
      • 2022-01-25
      相关资源
      最近更新 更多