Grid是ExtJS中最常用的组件之一,今天在此稍作整理,主要针对一些常用的功能知识点。


一、基础的Grid表格

Ext.create('Ext.data.Store', {
    storeId:'simpsonsStore',
    fields:['name', 'email', 'phone'],
    data:{'items':[
        { 'name': 'Lisa',  "email":"lisa@simpsons.com",  "phone":"555-111-1224"  },
        { 'name': 'Bart',  "email":"bart@simpsons.com",  "phone":"555-222-1234" }
    ]},
    proxy: {
        type: 'memory',
        reader: {
            type: 'json',
            root: 'items'
        }
    }
});

Ext.create('Ext.grid.Panel', {
    title: 'Simpsons',
    store: Ext.data.StoreManager.lookup('simpsonsStore'),
    columns: [
        { text: 'Name',  dataIndex: 'name' },
        { text: 'Email', dataIndex: 'email', flex: 1 },
        { text: 'Phone', dataIndex: 'phone' }
    ],
    height: 200,
    width: 400,
    renderTo: Ext.getBody()
});

ExtJS(2)- Grid技巧_group

以上是ExtJS官网的基础例子,最主要的两个参数,一个是store,用来管理grid的数据;还有个是columns,用来管理grid的结构。

store又可以分作加载本地数据和向服务器请求数据两种。


二、Grid的分页

    分页可以分为两种方法,后台分页与前端分页。顾名思义,后台分页是指,前台向后台请求第N页的数据,后台只组织第N页数据返回给前端显示;前端分页是指前端向后台请求所有数据返回给前端,然后前端根据分页参数来显示当前页码的数据。

this.bbar = new Ext.PagingToolbar({
	emptyMsg:"没有数据",
    displayInfo:true,
    displayMsg:"显示从{0}条数据到{1}条数据,共{2}条数据",
    store:store,
    pageSize:itemsPerPage
});

不管前端分页和后端分页,最好在Grid中都配置好bbar属性,bbar是用于显示分页数据的工具条。

(1)、后台分页

new Ext.data.Store({
    autoLoad:  {start:0, limit:itemsPerPage} ,
    model: 'Pactera.model.Job',
    pageSize: itemsPerPage, //每页的页数
    proxy: {
        type: 'ajax',
	url : 'ctrl/job/' + this.action,
	reader: {
	    type: 'json',
            root: 'data',
	    totalProperty: 'total'
	}
    }
})
{
    "data": [
        //返回的数据数组
    ],
    "total": 6,//数据总数,是
}

后端分页还有点很重要,该表格数据的查询参数的设置

//每次加载前,配置查询条件参数
thisStore.on('beforeload',function(thiz,options){
    thiz.proxy.extraParams = baseParams; //baseParams是每次查询的条件参数
});

(2)、前端分页

new Ext.data.Store({
	autoLoad:  {start:0, limit:itemsPerPage} ,
	model: 'Pactera.model.TPLProductivity',
	pageSize: itemsPerPage,
	proxy: Ext.create('Ext.ux.data.PagingMemoryProxy',{data:me.allData})
});

前端分页只需把data数据直接加载到Ext.ux.data.PagingMemoryProxy插件即可,当然保证ExtJS中有此插件。


三、Grid的多字段排序

store.sort([{
    property: 'score',
    direction: 'DESC' //第一优先级 倒序
},{
    property: 'total_count',
    direction: 'ASC'  //第二优先级 正序
}]);

排序也分情况,grid中的head默认点击就会排序,但仅限于单字段排序,当需要多字段排序时就需要store的sort方法。

在有分页的情况下默认排序情况又不一样,后端分页的时候默认排序只会排显示的一页的数据,而前端分页时默认排序也能完成所有的排序,但是我所用的4.2版本还是存在一些问题和瑕疵的。


四、Grid的分组

//分组统计组件
var grouping = Ext.create('Ext.grid.feature.GroupingSummary',{
    id: 'group',
    //分组行的自定义数据显示
    groupHeaderTpl:[
	    'NO.{name}  {children:this.formatName}',
	    {
	        formatName: function(children) {
	            return children[0].data["showName"];
	        }
	    }
	],
    
    hideGroupedHeader: false,
    enableGroupingMenu: true,
    startCollapsed:true
});

me.features = [grouping,
{
    ftype: 'summary', //grid总计插件
    dock:'top'
}];

注意:以上的features中加载了两个插件,第一个是进行分组,并对分组进行统计;第二个是对grid进行总体统计。统计数据代码如下:

{header: 'Client', dataIndex: 'clientName',width:180,locked:true,
    summaryType: 'count',//count指总计个数,还有sum、max、min、average
    summaryRenderer: function(value, summaryData, dataIndex) {
	if(value == arguments[5].store.data.length){
   		return "Total:";
	}else{
		return "";
	}
}}
groupField: 'ranking',//分组字段,该字段相同才会分到同一组,该字段配置到store中


五、Grid的编辑

var rowEditing = Ext.create('Ext.grid.plugin.RowEditing', {
    clicksToEdit: 1//点击几次进行编辑
})
this.plugins = [rowEditing];

出了RowEditing和有CellEditing,当然还要配置columns,例子如下:

{header: 'Column Name', dataIndex: 'displayName',align:'center',
editor:{
	xtype:'textfield',
	allowBlank:false
}}

编辑方式出了最简单的textfield,还有combobox、numberfield、checkbox等


六、批量操作

首先要设定选择的CheckboxModel组件

var selModel = Ext.create('Ext.selection.CheckboxModel', {
    listeners: {
        selectionchange: function(sm, selections) {
            me.down('#delete').setDisabled(selections.length === 0);
                //当前grid中的删除按钮在没有选择数据时disable
        }
    }
});
me.selModel = selModel;

批量删除按钮事件

var selections = me.getView().getSelectionModel().getSelection();

var idArr = [];
for (var i in selections){
	idArr.push(selections[i].get("id"));
}
var idStr = idArr.toString();
idStr = idStr.replace(/,/g,";")

Ext.MessageBox.confirm("Confirm delete?","Do you want to delete these records?",function(btn){
    if(btn == "yes"){
    	Ext.Ajax.request({
			url: 'ctrl/delete',
			params:{ids:idStr},
			success: function(res){
				Pactera.logger.showMsg("Delete team success.");
				me.store.reload();
			}
		});
    }
})


七、以上功能的一些冲突点

分页与分组就会有冲突,暂时未想到解决方案;

分页与排序:后端分页只能让后端排序,

                        前端分页可以前端排序;

分组与排序:分组后的排序,默认是将每组中的数据进行排序

    但是常会有这样的需求,就是根据分组后的统计数据将组进行排序,这种需求我只想到一种变通的方法,先我们用代码将数据分组,然后排序,然后我们给每条数据添加ranking字段,ranking字段既该字段所在组的排名,然后分组时将分组字段groupField设置为'ranking',store会默认将组按分组字段排序。


慢慢完善这段时间的ExtJS学习,欢迎交流与分享!