1.概述:app
在Ext项目开发中,Grid是用的最多的组件之一,在使用过程当中发现不少的配置都是相似的,在此对Grid作个简单的封装。工具
任务1.在grid工具栏中常常会有新增、编辑、删除等操做,咱们但愿当用户选择一条记录时编辑和删除都可点击,当选择多条记录是删除可点击,编辑被禁用,当不选择时,编辑和删除均不可用,通常这些工做都在Controller中增长selectionchange事件和render事件来完成,这样作太繁琐,工做量大,在这里更简洁的解决方案是给grid增长两个选择属性,singleSelects和multiSelects,即单选策略和多选策略来完成,具体方法以下一一介绍。this
任务2.grid中分页工具栏通常是必须的,因此也作个封装,不用在具体的grid中在设置分页组件了。spa
2.效果:(没什么可看的,就是一个普通的grid)code
3.代码(重点在这里)blog
Ext.define('app.view.LinkView',{ extend:'ux.Grid', alias : 'widget.linkview', singleSelects:['edit'], //单选策略 id multiSelects:['delete'],//多选策略 store : 'LinkStore', columns : [ { text : '行号', xtype: 'rownumberer', align : 'center', width:40 }, { text : '标题', dataIndex: 'linkTitle',align : 'left'}, { text : '链接', dataIndex: 'linkUrl',align : 'left'} ], tbar : [ { id : 'add', text : '新增', iconCls:'Plus-Circle' }, '-', { id : 'edit', text : '编辑', //glyph : 0xf044 , iconCls:'Pencil-Color' }, '-', { id : 'delete', text : '删除', //glyph : 0xf1f8, iconCls:'Minus-Circle' }, '->', { xtype : 'textfield', id : 'key', name : "key", emptyText:'标题...', enableKeyEvents: true, width : 148 }, { id : 'userSearch', glyph : 0xf002, id:'search', tooltip:'搜索', text : '搜索' } ], initComponent : function(){ Ext.setGlyphFontFamily('FontAwesome'); this.callParent(arguments); } });
说明:变得简洁了很多吧,红色的部分算是扩展部分。事件
①singleSelects:['edit'] :表示只有选择一行记录是edit才可点击,其余状况被禁用,edit表示按钮的id。ip
② multiSelects:['delete'] : 表示当选择不止一条记录时可点击。delete为按钮idci
③ 没有看到设置分页组件的代码,可是有分页组件,这都在ux.Grid.js中完成。开发
④ 还有许多其余默认属性均在ux.Grid.js中设置。
4.ux.Grid.js
/** * 扩展Ext Grid,增长singleSelects和multiSelects,默认有分页组件,说明以下 */ Ext.define('ux.Grid',{ extend:'Ext.grid.Panel', alias : 'widget.uxgrid', frame:false, border:false, layout:'fit', forceFit : true, columnLines : true, //选择策略 singleSelects:null, //单选策略 //当选择一条记录是启用,其余状况禁止 multiSelects:null, //多选策略 //当选择一条或多条记录是启用,不选择是禁用 selType : 'checkboxmodel', multiSelect : true, store : 'LinkStore', emptyText : '未找到任何数据!', initComponent : function(){ this.callParent(arguments); var grid = this; var singles = this.singleSelects != null?this.singleSelects:[]; var multis = this.multiSelects !=null?this.multiSelects:[]; grid.on('render',function(){ for(var i=0;i<singles.length;i++){ Ext.getCmp(singles[i]).disable(true); } for(var i=0;i<multis.length;i++){ Ext.getCmp(multis[i]).disable(true); } }); grid.on('selectionchange',function(selectModel, selected, eOpts){ if(selected.length==1){ for(var i=0;i<singles.length;i++){ Ext.getCmp(singles[i]).enable(true); } for(var i=0;i<multis.length;i++){ Ext.getCmp(multis[i]).enable(true); } }else if(selected.length > 1){ for(var i=0;i<singles.length;i++){ Ext.getCmp(singles[i]).disable(true); } for(var i=0;i<multis.length;i++){ Ext.getCmp(multis[i]).enable(true); } }else{ for(var i=0;i<singles.length;i++){ Ext.getCmp(singles[i]).disable(true); } for(var i=0;i<multis.length;i++){ Ext.getCmp(multis[i]).disable(true); } } }); //设置分页组件 grid.addDocked( { xtype : 'pagingtoolbar', store : grid.getStore(), dock : 'bottom', displayInfo : true, plugins:[ //靠左边的页码进度 //Ext.create('Ext.ux.SlidingPager', {}), //右边显示进度 Ext.create('Ext.ux.ProgressBarPager',{}) ] } ); } });
说明:
Ext.create('Ext.ux.SlidingPager', {}),Ext.create('Ext.ux.ProgressBarPager',{}),这是在Ext.ux.*包中的分页组件风格,要想使用,必须将他们导入到你的项目中,默认在ext的examples包中,把他们考到src目录下便可。
加载路径: