`
liusu
  • 浏览: 171200 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

修改ExtJs store默认的排序行为

    博客分类:
  • js
阅读更多
ExtJs2.0的时候,普通的Ext.data.SimpleStore的对数据的排序行为是区分大小写的。 比如有如下几个name,


    1,Ashely,
    2,amonda
    3,Cary


经过ExtJs SimpleStore排序后,出现的顺序如下:


    1,Ashely,
    2,Cary
    3,amonda


因为ExtJs内部是按照ASCII排序的,而在ASCII中,大写字母总在小写字母之前。

需要修改行为,使得排序不分区大小写。下面是我的实现,不通用,但是在这个例子是跑的通。

例子是ExtJs官方的的array_grid的例子,http://www.extjs.com/deploy/dev/examples/grid/array-grid.html

下面是我修改过的代码,array-grid.js
/*
 * Ext JS Library 2.2.1
 * Copyright(c) 2006-2009, Ext JS, LLC.
 * licensing@extjs.com
 * 
 * http://extjs.com/license
 */

Ext.onReady(function(){

    // NOTE: This is an example showing simple state management. During development,
    // it is generally best to disable state management as dynamically-generated ids
    // can change across page loads, leading to unpredictable results.  The developer
    // should ensure that stable state ids are set for stateful components in real apps.
    Ext.state.Manager.setProvider(new Ext.state.CookieProvider());
	
        //覆盖的排序在这里起作用。
	Ext.data.CustomSortStore = Ext.extend(Ext.data.SimpleStore,{
		sortData : function(f, direction){
			direction = direction || 'ASC';
			var st = this.fields.get(f).sortType;
			var fn = function(r1, r2 , store){
				var v1 = st(r1.data[f]), v2 = st(r2.data[f]);
				if(typeof(v1) == 'string' && typeof(v2) == 'string'){                              
                                        //去掉大小写限制
					var al = v1.toLowerCase(), bl= v2.toLowerCase();
					return al > bl ? 1 : (al < bl ? -1 : 0);
				}else{
					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);
			}
		}
	});

    var myData = [
        ['3m Co',71.72,0.02,0.03,'9/1 12:00am'],
		['citigroup, Inc.',49.37,0.02,0.04,'9/1 12:00am'],
        ['Altria Group Inc',83.81,0.28,0.34,'9/1 12:00am'],
        ['American Express Company',52.55,0.01,0.02,'9/1 12:00am'],
        ['American International Group, Inc.',64.13,0.31,0.49,'9/1 12:00am'],
        ['AT&T Inc.',31.61,-0.48,-1.54,'9/1 12:00am'],
        ['Boeing Co.',75.43,0.53,0.71,'9/1 12:00am'],
        ['Caterpillar Inc.',67.27,0.92,1.39,'9/1 12:00am'],
        ['E.I. du Pont de Nemours and Company',40.48,0.51,1.28,'9/1 12:00am'],
		['alcoa Inc',29.01,0.42,1.47,'9/1 12:00am'],
        ['Exxon Mobil Corp',68.1,-0.43,-0.64,'9/1 12:00am'],
        ['General Electric Company',34.14,-0.08,-0.23,'9/1 12:00am'],
        ['General Motors Corporation',30.27,1.09,3.74,'9/1 12:00am'],
        ['Hewlett-Packard Co.',36.53,-0.03,-0.08,'9/1 12:00am'],
        ['Honeywell Intl Inc',38.77,0.05,0.13,'9/1 12:00am'],
        ['Intel Corporation',19.88,0.31,1.58,'9/1 12:00am'],
        ['International Business Machines',81.41,0.44,0.54,'9/1 12:00am'],
        ['Johnson & Johnson',64.72,0.06,0.09,'9/1 12:00am'],
        ['JP Morgan & Chase & Co',45.73,0.07,0.15,'9/1 12:00am'],
        ['mcDonald\'s Corporation',36.76,0.86,2.40,'9/1 12:00am'],
        ['Merck & Co., Inc.',40.96,0.41,1.01,'9/1 12:00am'],
        ['Microsoft Corporation',25.84,0.14,0.54,'9/1 12:00am'],
        ['Pfizer Inc',27.96,0.4,1.45,'9/1 12:00am'],
        ['The Coca-Cola Company',45.07,0.26,0.58,'9/1 12:00am'],
        ['The Home Depot, Inc.',34.64,0.35,1.02,'9/1 12:00am'],
        ['The Procter & Gamble Company',61.91,0.01,0.02,'9/1 12:00am'],
        ['United Technologies Corporation',63.26,0.55,0.88,'9/1 12:00am'],
        ['Verizon Communications',35.57,0.39,1.11,'9/1 12:00am'],
        ['Wal-Mart Stores, Inc.',45.45,0.73,1.63,'9/1 12:00am']
    ];

    // example of custom renderer function
    function change(val){
        if(val > 0){
            return '<span style="color:green;">' + val + '</span>';
        }else if(val < 0){
            return '<span style="color:red;">' + val + '</span>';
        }
        return val;
    }

    // example of custom renderer function
    function pctChange(val){
        if(val > 0){
            return '<span style="color:green;">' + val + '%</span>';
        }else if(val < 0){
            return '<span style="color:red;">' + val + '%</span>';
        }
        return val;
    }

    // create the data store
    // 这里使用我们自定义的Store
    var store = new Ext.data.CustomSortStore({
        fields: [
           {name: 'company'},
           {name: 'price', type: 'float'},
           {name: 'change', type: 'float'},
           {name: 'pctChange', type: 'float'},
           {name: 'lastChange', type: 'date', dateFormat: 'n/j h:ia'}
        ]
    });
	
    store.loadData(myData);

    // create the Grid
    var grid = new Ext.grid.GridPanel({
        store: store,
        columns: [
            {id:'company',header: "Company", width: 160, sortable: true, dataIndex: 'company'},
            {header: "Price", width: 75, sortable: true, renderer: 'usMoney', dataIndex: 'price'},
            {header: "Change", width: 75, sortable: true, renderer: change, dataIndex: 'change'},
            {header: "% Change", width: 75, sortable: true, renderer: pctChange, dataIndex: 'pctChange'},
            {header: "Last Updated", width: 85, sortable: true, renderer: Ext.util.Format.dateRenderer('m/d/Y'), dataIndex: 'lastChange'}
        ],
        stripeRows: true,
        autoExpandColumn: 'company',
        height:350,
        width:600,
        title:'Array Grid'
    });

    grid.render('grid-example');
});


排序结果:

----------------
这里的办法可以实现修改排序行为,但是却不通用。我想要的是一种可以覆盖Ext.data.Store的行为的方式,可以方便在new instance的时候注入sort function.我有试着这样去写:

//省略其他
	Ext.apply(Ext.data.Store,{
		sortFn : undefined,
		sortData : function(f, direction){
			direction = direction || 'ASC';
			var st = this.fields.get(f).sortType;
			var fn = function(r1, r2 , store){
				var v1 = st(r1.data[f]), v2 = st(r2.data[f]);
				if(this.sortFn && typeof(this.sortFn) == 'function'){
					return this.sortFn(v1,v2);
				}else{
					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);
			}
		}
	});
	
	// 省略其他
       // 构造store的时候传入排序函数:
    var store = new Ext.data.CustomSortStore({
        fields: [
           {name: 'company'},
           {name: 'price', type: 'float'},
           {name: 'change', type: 'float'},
           {name: 'pctChange', type: 'float'},
           {name: 'lastChange', type: 'date', dateFormat: 'n/j h:ia'}
        ],
		sortFn : function(v1,v2){
			if(typeof(v1) == 'string' && typeof(v2) == 'string'){
				var v1l = v1.toLowerCase(),v2l = v2.toLowerCase();
				return return v1l > v2l ? 1 : (v1l < v2l ? -1 : 0);
			}else{
				return v1 > v2 ? 1 : (v1 < v2 ? -1 : 0);
			}
		}
    });



但是这样做不起任何作用,实际排序的时候走的还是Ext.data.Store的默认的sortData方法,并不能覆盖。

我想问问,怎么样才能实现我想的那种效果?

  • 大小: 54.2 KB
分享到:
评论
1 楼 liusu 2009-12-17  
补充一条,我用的ExtJs2.2

相关推荐

    Extjs grid 中文排序问题修正

    EXTJS Grid默认的排序机制对于英文字符处理得较好,但对于中文字符,由于编码和比较规则的不同,可能会导致排序结果不正确。本教程将详细讲解如何修正EXTJS Grid中的中文排序问题。 首先,我们需要理解EXTJS Grid的...

    Extjs4 关于Store的一些操作(加载/回调/添加)

    EXTJS4的Store在默认情况下采用延迟加载(lazy loading)策略,这意味着当首次渲染Grid时,数据并不会立即加载,而是会在用户滚动或需要时才开始加载。这种行为可能导致用户看到一片空白,直到数据加载完成。为了...

    Ext中文排序问题

    由于中文字符的Unicode编码并非按照汉语拼音或笔画顺序排列,因此直接使用字符串的`localeCompare()`方法或其他默认排序函数可能无法得到正确的结果。在ExtJS中,解决这个问题的关键是自定义排序函数,并正确应用到...

    Extjs 4.2分组小计

    用户可以通过拖动列标题来重新排序,ExtJS会自动更新分组和小计。如果你需要在运行时更改分组或小计的配置,可以调用`store.setGroupField`和`column.setSummaryType`方法。 5. **性能优化** 当数据量较大时,...

    Extjs Grid 扩展实例

    Grid提供了丰富的功能,包括分页、排序、过滤、编辑等,是ExtJS库中的核心组件之一。"Extjs Grid 扩展实例"是一个演示如何增强Grid功能的实践案例,通过这个实例,我们可以学习到如何在原有Grid的基础上进行自定义...

    EXTJS网站模板

    4. **强大的表格和表单**:EXTJS的表格组件支持大量数据的展示和操作,包括排序、分页、过滤等功能;表单组件则支持各种类型的输入控件,易于数据收集。 5. **可扩展性**:EXTJS允许开发者自定义组件,以满足特定...

    Extjs grid分页1

    7. **自定义分页栏**:可以通过覆盖`pagingtoolbar`的默认模板来自定义分页栏的外观和功能,比如添加自定义按钮或更改样式。 综上所述,ExtJS Grid的分页功能提供了一种高效的方式来处理和展示大量数据。通过合理的...

    EXTJS4.0视频教程 30集 下载地址

    - **自定义主题**:通过修改默认主题文件或创建新的主题文件来实现个性化的外观设计。 **3.2 应用程序架构** - **模块化开发**:通过模块化的思想组织代码,提高可维护性和可重用性。 - **MVC模式**:采用模型-...

    ExtJs_grid.txt

    其中,`defaultSortable`属性用于设置是否默认启用列排序,如果设为`true`,则所有列都可排序。 #### 三、Store 和 Data Reader `Store`是ExtJs中用于管理数据的核心组件,可以使用`MemoryProxy`或`AjaxProxy`作为...

    EXTJS 转EXCEL实例

    在EXTJS中,数据网格(Grid)是一种常用的数据展示组件,它能够以表格形式展示大量数据,并支持排序、分页、过滤等多种操作。要将GRID中的数据导出为Excel,我们需要涉及以下几个关键步骤: 1. **数据准备**:首先...

    ExtJs Grid选择行

    在ExtJs框架中,Grid组件是一种非常常用的展示数据表格的方式,它提供了丰富的功能,包括数据的排序、分页、过滤以及行选择等。在实际应用中,经常需要根据用户交互来判断Grid中的行是否被选中,以便进行下一步的...

    Extjs4的TreeGrid例子

    5. **扩展和插件**:ExtJS 4允许开发者通过扩展(Extensions)和插件(Plugins)增强TreeGrid的功能,例如,拖放排序、行编辑、分页等。 6. **Tutorials和Examples**:压缩包中的`Examples`和`Tutorials`目录可能...

    解决Ext Grid中文排序问题

    然而,默认情况下,EXT Grid遵循ASCII码排序规则,这在处理中文字符时可能导致排序不符合预期,因为中文字符的ASCII值与它们的拼音或笔画顺序无关。在中文环境中,我们通常希望按照汉字的拼音或笔画顺序来排序。 ...

    精通JS脚本之ExtJS框架.part2.rar

    10.4 修改节点的默认图标 10.5 从节点弹出对话框 10.6 节点提示信息 10.7 为节点设置超链接 10.8 树形的拖放 10.8.1 节点拖放的3种形式 10.8.2 叶子不能append 10.8.3 判断拖放的目标 10.8.4 树之间的拖放 ...

    Ext.data.Store的基本用法

    // 设置默认排序 store.setDefaultSort('name', 'DESC'); // 调用sort方法排序 store.sort('name', 'DESC'); ``` 还可以通过`getSortState`方法获取当前的排序状态,该方法返回一个包含`field`和`direction`的JSON...

    EXTJS 服装批发网站后台

    开发者可能使用EXTJS的Model和Store来定义和管理产品的数据结构,而View则负责渲染数据到界面上。此外,EXTJS的FormPanel可能用于添加、修改和查看产品详情,包括产品名称、类别、库存、价格等信息。 2. **订单管理...

    extjs grid 遍历

    其中,Grid组件是ExtJS中最常用且功能强大的组件之一,用于展示和操作表格数据,支持复杂的数据处理、排序、筛选等功能。 ### ExtJS Grid的遍历方法详解 #### 1. 获取选中模型:`var model = grid....

    ExtJs中gridpanel分组后组名排序实例代码

    总的来说,ExtJs中的`gridpanel分组后组名排序`涉及到的关键技术包括自定义`GroupingStore`子类、重写`groupBy`方法来设置分组和排序规则,以及在数据变化时调用`applySort`和`applyGrouping`方法以保持分组状态的...

Global site tag (gtag.js) - Google Analytics