ExtJS(2)- Grid技巧

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

一、基础的Grid表格

Ext.create(‘Ext.data.Store‘, {
    storeId:‘simpsonsStore‘,
    fields:[‘name‘, ‘email‘, ‘phone‘],
    data:{‘items‘:[
        { ‘name‘: ‘Lisa‘,  "email":"[email protected]",  "phone":"555-111-1224"  },
        { ‘name‘: ‘Bart‘,  "email":"[email protected]",  "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官网的基础例子,最主要的两个参数,一个是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等

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

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

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

前端分页可以前端排序;

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

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

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

时间: 2024-10-12 13:01:50

ExtJS(2)- Grid技巧的相关文章

[ExtJS5学习笔记]第三十三节 sencha extjs 5 grid表格导出excel

使用extjs肯定少不了使用表格控件,用到表格,领导们(一般)还是惯于使用excel看数据,所以用到extjs表格的技术猿们肯定也会有导出表格excel这一个需求,本文主要针对如何在用extjs将grid表格导出到excel,使用的是前端导出,不涉及后端. 本文目录 本文目录 源代码打包下载 将源代码嵌入到应用中 查看导出按钮以及导出效果 扩展支持sum统计和groupsum分组 源代码打包下载 本次使用的是github上的一个开源项目Exporter 下载地址:https://github.c

EXTJS中grid的数据特殊显示,不同窗口的数据传递

//EXTJS中grid的数据特殊显示renderer : function(value, metaData, record, rowIndex, colIndex, store, view) { var USED_AMOUNT_ = 0; for (var i = 0; i < matMonthPlanHisList.length; i++) { if(matMonthPlanHisList[i].MAT_NO_ == record.get('MAT_NO_')){ USED_AMOUNT_

ExtJS获取Grid的行数

1.     grid.getSelectionModel().getCount() ;  // 获得当前选中的行数  2.     grid.getStore().getTotalCount();  // 获得记录总数  3.     grid.getStore().getCount();   // 获得当前页的记录总数 ExtJS获取Grid的行数,布布扣,bubuko.com

[ExtJS5学习笔记]第三十四节 sencha extjs 5 grid表格之java后台导出excel

继上次使用js前端导出excel之后,还有一个主要大家比较关注的是后台实现导出excel,因为本人开发使用的java所以这里使用apache的开源项目poi进行后台excel的导出. 本文目录 本文目录 poi项目下载及加载 extjs前端导出设置 extjs后台对应的解决方案 创建excel工作簿 创建一个excel页签 生成excel样式并初始化 产生表格标题行build headers 构造数据行build rows poi项目下载及加载 POI项目是apache官网的一个开源项目,其主要

Extjs中grid前端分页使用PagingMemoryProxy【二】

    在项目中遇到Grid前端分页,本人也是刚接触extjs没多久,为了实现效果,一直找了很久才实现出来,对于代码中的一些也不能详细的说明出来, 不知道能不能帮助到遇到同样问题的朋友,所以将例子代码贴出来大家一起相互学习下. 在项目中时常会用到前端分页的效果,使用grid来进行分页, 在源代码中\examples\ux\data\PagingMemoryProxy.js,此时要使用该js文件,在项目引用该文件. <script type="text/javascript" sr

学习ExtJS的grid布局

这是之前学习ExtJS布局的时候我导师让我重点熟悉的内容.之后会发一个最近写的结合MVC项目的grid布局的案例. 上一篇关于ExtJS的学习资料什么的都已经更在上一篇了,这里只是对一些代码的记录. [学习资料](ExtJS4中的Grid.Tree.Form)http://www.cnblogs.com/niejunchan/p/4998512.html [效果] Array_Grid Tree_Grid [代码] [Array_Grid的代码] <!DOCTYPE html> <htm

ExtJS:Grid数据导出至excel实例

导出函数ExportExcel() var config={ store: alldataStore, title: '测试标题' }; var tab=tabPanel.getActiveTab();//当前活动状态的Panel ExportExcel(tab,config);//调用导出函数 ExportGridToExcel.js var Base64 = { // private property _keyStr: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghi

Extjs Ext.grid.column.Column 自适应内容

var griddb = Ext.ComponentQuery.query("Ali_DeliveryAuthorityList"); griddb = griddb[griddb.length - 1]; var store = Ext.getStore("DeliveryAuthorityStore"); store.proxy.extraParams = obj; store.loadPage(1 , { scope: this, callback: func

Extjs的grid数据加载之后默认选择第一行数据

store.load({     callback:function(r){// 回调函数 if(r.length>0){ //判断是否有数据 grid.getSelectionModel().select(0,true);             } }});