第二章:Ext.js高级组件
grid组件
普通方式
表格面板类Ext.grid.Panel
- xtype(别名):gridpanel、grid
- title标题、renderTo渲染至、width宽、height高
- frame : Boolean 是否填充渲染gridpanel
- forceFit : true 列是否自动填充
- store : store 数据集
- tbar: []
- 头部工具栏
- dockedItems : Object/Array
- 可定位的停靠工具条(上、下、左、右)
- selType : ‘checkboxmodel’
- 选择框选择模式
- multiSelect :true
- 是否允许多选
- plugins 插件
- columns : Array
- 列模式(Ext.grid.column.Columnxtype: gridcolumn)
- text : String 列标题
- dataIndex : String 和Model列对应
- sortable : true 是否可以分类
- field:
- 可编辑字段配置
- getStore
- ownerCt返回父级
- 列模式(Ext.grid.column.Columnxtype: gridcolumn)
- grid案例
- gridDemo.js文件代码
Ext.QuickTips.init(); //初始化提示 创建表格面板 var grid = Ext.create("Ext.grid.Panel",{ title : 'Grid Demo', frame : true, //面板渲染 //forceFit : true, //自动填充列空白处(4.0的选择框有空隙问题时指定宽度) width : 600, height: 280, columns : [ //列模式 {text:"Name",dataIndex:'name',width:100}, {text:"age",dataIndex:'age',width:100}, {text:"email",dataIndex:'email',width:350, field:{ //指定可编辑字段 xtype:'textfield', //指定可编辑类型 allowBlank:false } } ], tbar :[ {xtype:'button',text:'添加',iconCls:'table_add'}, {xtype:'button',text:'删除',iconCls:'table_remove', handler:function(o){ //var gird = o.findParentByType("gridpanel"); //获取父级 var gird = o.ownerCt.ownerCt; //获取删除按钮的父级的父级 // 获取选中数据集 var data = gird.getSelectionModel().getSelection(); if(data.length == 0){ Ext.Msg.alert("提示","请选择数据"); }else{ 根据name得到数据 var st = gird.getStore(); //获取数据集 var ids = []; //存储被选中数据的name集合 Ext.Array.each(data,function(record){ ids.push(record.get('name')); }) 后台操作(delete)、前端操作DOM进行删除(ExtJs) Ext.Ajax.request({ url:'/extjs/extjs!deleteData.action', params:{ids:ids.join(",")}, //指定要删除数据的name集合 method:'POST', timeout:2000, //设定响应等待时间 success:function(response,opts){ Ext.Array.each(data,function(record){ st.remove(record); //从store中删除该条记录 }) } }) } } }, {xtype:'button',text:'修改',iconCls:'table_edit'}, {xtype:'button',text:'查看',iconCls:'table_comm'} ], dockedItems :[{ //可定位的停靠工具条 xtype:'pagingtoolbar', //分页工具条 store:Ext.data.StoreManager.lookup('s_user'), //指定store dock:'bottom', displayInfo:true //是否展示信息(eg:条数) }], plugins:[ //配置可编辑单元格插件实现grid的编辑 Ext.create("Ext.grid.plugin.CellEditing",{ clicksToEdit : 1 //点击N次进入编辑 }) ], selType:'checkboxmodel', //设定选择模式 multiSelect:true, //允许多选 renderTo :Ext.getBody(), // 通过指定store的id在StoreManager获取store store : Ext.data.StoreManager.lookup('s_user') });
- model.js文件代码
Model类 Ext.define("user",{ extend:"Ext.data.Model", fields:[ {name:'name',type:'string',sortable:true}, {name:'age',type:'int',sortable:true}, {name:'email',type:'string',sortable:true} ] }); store类 Ext.create("Ext.data.Store",{ model:'user', storeId:'s_user', //指定了storeId后store由StoreManager自动管理 proxy:{ type:'ajax', url:'/extjs/extjs!getUserList.action', reader:{ type:'json', root:'root' }, writer:{ type:'json' } }, autoLoad:true //自动加载数据 });
- gridDemo.js文件代码
MVC方式
- extjs创建应用的方法
- Ext.application();(Ext.app.Application类)
Ext.application({ name: 'MyApp', launch: function() { Ext.create('Ext.container.Viewport', { items: { html: 'My App'} }); } });
- Ext.app.Controller 控制器
- Ext.ComponentQuery 组件查询(extjs4.0新特性)
- Ext.container.Containerxtype: container类
- Ext.application();(Ext.app.Application类)
- grid组件的MVC实现
- html文件代码中引入app.js文件
<link rel="stylesheet"type="text/css" href="extjs/resources/css/ext-all.css" /> <script type="text/javascript" src="extjs/bootstrap.js"></script> <script type="text/javascript" src="app.js"></script>
- app.js文件代码
Ext.onReady(function(){ Ext.QuickTips.init(); Ext.Loader.setConfig({ //执行加载 enabled:true }); Ext.application({ name : 'AM', //应用名 appFolder : "app", //应用目录 launch:function(){ //当前页面加载完成后执行 Ext.create('Ext.container.Viewport', { //创建Viewport layout:'auto', //自动填充布局 items: { xtype: 'userlist', //view的别名 title: 'Users', html : 'List of users will go here' } }); }, controllers:['Users'] }); })
- controller/Users.js文件代码
Ext.define('AM.controller.Users', { extend: 'Ext.app.Controller', init:function(){ this.control({ //控制事件等 'userlist button[id=delete]':{ click:function(o){ var gird = o.ownerCt.ownerCt; var data = gird.getSelectionModel().getSelection(); if(data.length == 0){ Ext.Msg.alert("提示","请选择数据"); }else{ 根据name得到数据 var st = gird.getStore(); //获取数据集 var ids = []; //存储被选中数据的name集合 Ext.Array.each(data,function(record){ ids.push(record.get('name')); }) 后台操作(delete)、前端操作DOM进行删除(ExtJs) Ext.Ajax.request({ url:'/extjs/extjs!deleteData.action', params:{ids:ids.join(",")}, //指定要删除数据的name集合 method:'POST', timeout:2000, //设定响应等待时间 success:function(response,opts){ Ext.Array.each(data,function(record){ st.remove(record); //从store中删除该条记录 }) } }) } } } }); }, views:['List'], stores :["Users"], models :["User"] });
- view/List.js文件代码
Ext.define("AM.view.List",{ extend:'Ext.grid.Panel', title : 'Grid Demo', alias: 'widget.userlist', frame : true, //面板渲染 width : 600, height: 280, columns : [ //列模式 {text:"Name",dataIndex:'name',width:100}, {text:"age",dataIndex:'age',width:100}, {text:"email",dataIndex:'email',width:350, field:{ xtype:'textfield', allowBlank:false } } ], tbar :[ {xtype:'button',text:'添加',iconCls:'table_add'}, {xtype:'button',id:'delete',text:'删除',iconCls:'table_remove'}, {xtype:'button',text:'修改',iconCls:'table_edit'}, {xtype:'button',text:'查看',iconCls:'table_comm'} ], dockedItems :[{ xtype:'pagingtoolbar', store:'Users', dock:'bottom', displayInfo:true }], plugins:[ Ext.create("Ext.grid.plugin.CellEditing",{ clicksToEdit : 2 //单击时会报错(ext.js的bug) }) ], selType:'checkboxmodel', //设定选择模式 multiSelect:true, store : 'Users', initComponent:function(){ //初始化组件,进行渲染 this.callParent(arguments); } });
- store/Users.js文件代码
Ext.define('AM.store.Users', { extend: 'Ext.data.Store', model: 'AM.model.User', //define时的名 storeId: 's_user', proxy:{ type:'ajax', url:'/extjs/extjs!getUserList.action', reader: { type: 'json', root: 'root' }, writer:{ type:'json' } }, autoLoad: true //自动加载数据(很关键) });
- model/User.js文件代码
Ext.define('AM.model.User', { extend: 'Ext.data.Model', fields: [ {name: 'name', type: 'string',sortable : true}, {name: 'age', type: 'int',sortable : true}, {name: 'email', type: 'string',sortable : true} ] });
- html文件代码中引入app.js文件
grid列模式
- Ext.grid.column.Column
- xtype: gridcolumn
- Ext.grid.column.Action
- 在表格中渲染一组图标按钮,并为其赋予某种功能
- xtype: actioncolumn
- altText:String 设置应用image元素上的alt
- handler:function(view,rowindex,collndex,item,e);
- icon:图标资源地址、iconCls:图标样式
- items:多个图标的数组 (使用MVC时不建议使用)
- stopSelection:设置是否单击选中
- Ext.grid.column.Boolean
- xtype: booleancolumn
- falseText,trueText
- xtype: booleancolumn
- Ext.grid.column.Date
- xtype: datecolumn
- format:’Y年m月的日’
- xtype: datecolumn
- Ext.grid.column.Number
- xtype: numbercolumn
- format:‘0,000’
- xtype: numbercolumn
- Ext.grid.column.Template
- xtype:’templatecolumn’,
- tpl :”“
- Ext.grid.RowNumberer
- xtype: rownumberer
- 数据字典
- 业务数据字典
- 风险等级,城市
- 不变的数据字典
- 男,女;是,否;血型
- 业务数据字典
- 案例
- controller/Users.js文件代码
Ext.define('AM.controller.Users', { extend: 'Ext.app.Controller', init:function(){ this.control({ //控制事件等 'userlist button[id=delete]':{ click:function(o){ var gird = o.ownerCt.ownerCt; var data = gird.getSelectionModel().getSelection(); if(data.length == 0){ Ext.Msg.alert("提示","请选择数据"); }else{ 根据name得到数据 var st = gird.getStore(); //获取数据集 var ids = []; //存储被选中数据的name集合 Ext.Array.each(data,function(record){ ids.push(record.get('name')); }) 后台操作(delete)、前端操作DOM进行删除(ExtJs) Ext.Ajax.request({ url:'/extjs/extjs!deleteData.action', params:{ids:ids.join(",")}, //指定要删除数据的name集合 method:'POST', timeout:2000, //设定响应等待时间 success:function(response,opts){ Ext.Array.each(data,function(record){ st.remove(record); //从store中删除该条记录 }) } }) } } }, "userlist actioncolumn[id=delete]":{ click : function(o,item,rowIndex,colIndex ,e){ alert(rowIndex+" "+colIndex); } } }); }, views:['List'], stores :["Users"], models :["User"] });
- view/List.js文件代码
Ext.define("AM.view.List",{ extend:'Ext.grid.Panel', title : 'Grid Demo', alias: 'widget.userlist', frame : true, //面板渲染 width : 600, height: 280, columns : [ //列模式 Ext.create("Ext.grid.RowNumberer",{}), {text:"Name",dataIndex:'name',width:100}, {text:"age",dataIndex:'age',width:100}, {text:"email",dataIndex:'email',width:200, field:{ xtype:'textfield', allowBlank:false } },{ text:'sex', dataIndex:'sex', width:50, DDName:'sy_sex', renderer:function(value){ if(value){ if(value == "女"){ return "<font color='green'>"+value+"</font>" }else if(value == "男"){ return "<font color='red'>"+value+"</font>" } } } },{ text:'isIt', dataIndex:'isIt', xtype : "booleancolumn", width:50, trueText:'是', falseText:'不是' },{ text:'birthday', dataIndex:'birthday', xtype : "datecolumn", width:150, format:'Y年m月d日' },{ text:'deposit', dataIndex:'deposit', xtype:'numbercolumn', width:150, format:'0,000' },{ text:'描述', xtype:'templatecolumn', tpl:'姓名是{name} 年龄是{age}', width:150 },{ text:'Action', xtype:'actioncolumn', id:'delete', icon:'app/view/image/table_delete.png', width:50 } ], tbar :[ {xtype:'button',text:'添加',iconCls:'table_add'}, {xtype:'button',id:'delete',text:'删除',iconCls:'table_remove'}, {xtype:'button',text:'修改',iconCls:'table_edit'}, {xtype:'button',text:'查看',iconCls:'table_comm'} ], dockedItems :[{ xtype:'pagingtoolbar', store:'Users', dock:'bottom', displayInfo:true }], plugins:[ Ext.create("Ext.grid.plugin.CellEditing",{ clicksToEdit : 2 //单击时会报错(ext.js的bug) }) ], selType:'checkboxmodel', //设定选择模式 multiSelect:true, store : 'Users', initComponent:function(){ //初始化组件,进行渲染 this.callParent(arguments); } });
- model/User.js文件代码
Ext.define('AM.model.User', { extend: 'Ext.data.Model', fields: [ {name: 'name', type: 'string',sortable : true}, {name: 'age', type: 'int',sortable : true}, {name: 'email', type: 'string',sortable : true}, {name: 'birthday', type: 'string',sortable : true}, {name: 'deposit', type: 'int',sortable : true}, {name: 'isIt', type: 'string',sortable : true}, {name: 'sex', type: 'string',sortable : true} ] });
grid选择模式
- 根类
- Ext.selection.Model
- 重要方法
- 撤销选择 deselect( Ext.data.Model/Index records, Boolean suppressEvent ) : void
- 得到选择的数据getSelection( ) : Array
- 得到最后被选择的数据getLastSelected( ) : void
- 判断指定的数据是否被选择上isSelected( Record/Number record ) : Boolean
- 选择指定的行selectRange( Ext.data.Model/Number startRow, Ext.data.Model/Number endRow, [Boolean keepExisting], Object dir ) : void
- keepExisting true保持已选则的,false重新选择
- 隐藏了一个单元格的选择模式
- selType: ‘cellmodel’
- 从这发现的Ext.grid.plugin.CellEditing
- 重要方法
- 得到被选择的单元格getCurrentPosition() Object
- Ext.JSON.encode()
- itemclick( Ext.view.View this, Ext.data.Model record, HTMLElement item, Number index, Ext.EventObject e, Object options )
- selectByPosition({“row”:5,”column”:6})
- 很实用,选择要特殊处理的数据
- selType: ‘cellmodel’
- 多选框选择器Ext.selection.CheckboxModel
- 重要方法
- Ext.selection.RowModel
- rowmodel 行选择器
- Ext.selection.RowModel
- 重要属性
- multiSelect 允许多选
- simpleSelect 单选选择功能
- enableKeyNav 允许使用键盘
- 重要方法
Grid特性
- Ext.grid.feature.Feature
-
表格的行体Ext.grid.feature.RowBody
- 重要方法
- getAdditionalData( Object data, Number idx, Ext.data.Model record, Object orig ) : void
- 如果要展示这个面板那么必须复写这个方法
features: [ Ext.create("Ext.grid.feature.RowBody",{ getAdditionalData:function(data,idx,record,orig){ ...... } }) ],
- 必须返回行体的对象
var headerCt = this.view.headerCt, colspan = headerCt.getColumnCount(); return { rowBody: "", rowBodyCls: this.rowBodyCls, rowBodyColspan: colspan };
- 如果要展示这个面板那么必须复写这个方法
- getAdditionalData( Object data, Number idx, Ext.data.Model record, Object orig ) : void
- 重要方法
-
Ext.grid.feature.AbstractSummary
- Ext.grid.feature.Summary
- 第一步
features: [{ ftype: 'summary' }],
- 第二步
- columns中配置summaryType: ‘count’, (count,sum,min,max,average)
summaryRenderer: function(value, summaryData, dataIndex) { return Ext.String.format(' : '+value); }
- columns中配置summaryType: ‘count’, (count,sum,min,max,average)
-
Ext.grid.feature.Grouping
- 在store中设置可以分组的属性
- groupField : ‘’
- 在view中增加代码
Ext.create("Ext.grid.feature.Grouping",{ groupByText : "职业分组", groupHeaderTpl : "职业{name} 一共{rows.length}人", showGroupsText : "展示分组", startCollapsed : true }
- 重要事件
- groupclick
- groupdblclick
- groupcontextmenu
- groupexpand
- groupcollapse
- 在store中设置可以分组的属性
-
扩展
- Ext.grid.feature.GroupingSummary
- Ext.grid.feature.Chunking
-
代码
- app.js
Ext.onReady(function(){ Ext.QuickTips.init(); Ext.Loader.setConfig({ enabled:true }); Ext.application({ name : 'AM',//应用的名字 appFolder : "app",//应用的目录 launch:function(){//当前页面加载完成执行的函数 Ext.create('Ext.container.Viewport', { //简单创建一个试图 layout:'auto',//自动填充布局 items: { xtype: 'userlist', title: 'Users', html : 'List of users will go here' } }); }, controllers:[ 'Users' ] }); })
- controller/Users.js
Ext.define('AM.controller.Users', { extend: 'Ext.app.Controller', init:function(){ this.control({ 'userlist':{ itemclick:function(View, record, item, index, e, options ){ var sm = View.getSelectionModel();//.getSelection(); //alert(Ext.JSON.encode(sm.getCurrentPosition())); sm.selectByPosition({"row":1,"column":2}); } }, 'userlist button[id=selection]':{ click:function(o){ var gird = o.ownerCt.ownerCt; var sm = gird.getSelectionModel(); //sm.deselect(0); //alert(sm.getLastSelected().get('name')) //alert(sm.isSelected(0)); //sm.selectRange(1,2,true); sm.selectByPosition({"row":2,"column":3}); } }, 'userlist button[id=del]':{ click:function(o){ var gird = o.ownerCt.ownerCt; var data = gird.getSelectionModel().getSelection(); if(data.length == 0){ Ext.Msg.alert("提示","您最少要选择一条数据"); }else{ //1.先得到ID的数据(name) var st = gird.getStore(); var ids = []; Ext.Array.each(data,function(record){ ids.push(record.get('name')); }) //2.后台操作(delet) Ext.Ajax.request({ url:'/extjs/extjs!deleteData.action', params:{ids:ids.join(",")}, method:'POST', timeout:2000, success:function(response,opts){ Ext.Array.each(data,function(record){ st.remove(record); }) } }) //3.前端操作DOM进行删除(ExtJs) } } }, "userlist actioncolumn[id=delete]":{ click : function(o,item,rowIndex,colIndex ,e){ alert(rowIndex+" "+colIndex); } } }); }, views:[ 'List' ], stores :[ "Users" ], models :[ "User" ] });
- model/User.js
Ext.define('AM.model.User', { extend: 'Ext.data.Model', fields: [ {name: 'name', type: 'string',sortable : true}, {name: 'age', type: 'int',sortable : true}, {name: 'email', type: 'string',sortable : true}, {name: 'birthday', type: 'string',sortable : true}, {name: 'deposit', type: 'int',sortable : true}, {name: 'isIt', type: 'string',sortable : true}, {name: 'sex', type: 'string',sortable : true} ] });
- store/Users.js
Ext.define('AM.store.Users', { extend: 'Ext.data.Store', model: 'AM.model.User', storeId: 's_user', groupField : 'sex', proxy:{ type:'ajax', url:'/extjs/extjs!getUserList.action', reader: { type: 'json', root: 'topics' },writer:{ type:'json' } }, autoLoad: true // });
- view/List.js
Ext.define("AM.view.List",{ extend:'Ext.grid.Panel', title : 'Grid Demo',//标题 alias: 'widget.userlist', frame : true,//面板渲染 width : 1100, height: 450, features: [ Ext.create("Ext.grid.feature.RowBody",{ getAdditionalData: function(data, idx, record, orig) { var headerCt = this.view.headerCt, colspan = headerCt.getColumnCount(); return { rowBody: record.get('email'), rowBodyCls: this.rowBodyCls, rowBodyColspan: colspan }; } }),{ ftype: 'summary' },Ext.create("Ext.grid.feature.Grouping",{ groupByText : "性别分组", groupHeaderTpl : "性别{name} 一共{rows.length}人", showGroupsText : "展示分组" }) ], columns : [ //列模式 Ext.create("Ext.grid.RowNumberer",{}), {text:"Name",dataIndex:'name',width:100}, {text:"age",dataIndex:'age',width:100, summaryType:'average', summaryRenderer: function(value, summaryData, dataIndex) { return Ext.util.Format.number(value,"00.0") } }, {text:"email",dataIndex:'email',width:200, field:{ xtype:'textfield', allowBlank:false } },{ text:'sex', dataIndex:'sex', width:50, DDName:'sy_sex', renderer:function(value){ if(value){ if(value == "女"){ return "<font color='green'>"+value+"</font>" }else if(value == "男"){ return "<font color='red'>"+value+"</font>" } } } },{ text:'isIt', dataIndex:'isIt', xtype : "booleancolumn", width:50, trueText:'是', falseText:'不是' },{ text:'birthday', dataIndex:'birthday', xtype : "datecolumn", width:150, format:'Y年m月d日' },{ text:'deposit', dataIndex:'deposit', xtype:'numbercolumn', width:150, format:'0,000' },{ text:'描述',xtype:'templatecolumn', tpl:'姓名是{name} 年龄是{age}', width:150 },{ text:'Action',xtype:'actioncolumn', id:'delete', icon:'app/view/image/table_delete.png', width:50//, // items :[ // {},{} // ] // handler:function(grid,row,col){ // alert(row+" "+col); // } } ], tbar :[ {xtype:'button',text:'添加',iconCls:'table_add'}, {xtype:'button',id:'del',text:'删除',iconCls:'table_remove'}, {xtype:'button',text:'修改',iconCls:'table_edit'}, {xtype:'button',text:'查看',iconCls:'table_comm'}, {xtype:'button',id:'selection',text:'selection',iconCls:'table_comm'} ], dockedItems :[{ xtype:'pagingtoolbar', store:'Users', dock:'bottom', displayInfo:true }], plugins:[ Ext.create("Ext.grid.plugin.CellEditing",{ clicksToEdit : 2 }) ], //selType:'rowmodel',//设定选择模式 selType:'cellmodel', //multiSelect:true,//运行多选 //enableKeyNav :true, store : 'Users', initComponent:function(){ this.callParent(arguments); } });
- app.js
grid插件
- 可编辑插件
- 根类Ext.grid.plugin.Editing
- Ext.grid.plugin.CellEditing
- 保存修改的两种办法
- 设立保存按钮,用户单击的时候保存数据
st.sync(); var records = st.getUpdatedRecords(); Ext.Array.each(records,function(model){ model.commit(); });
- 注册edit事件
- e.record.commit();
- 设立保存按钮,用户单击的时候保存数据
- 保存修改的两种办法
- Ext.grid.plugin.RowEditing
- 4.0.1a版本不推荐这个功能
Ext.create('Ext.grid.plugin.RowEditing', { clicksToEdit: 1 })
- 4.0.1a版本不推荐这个功能
- 表格拖拽Ext.grid.plugin.DragDrop
- 注意:配置有变化
viewConfig:{ plugins:[ Ext.create('Ext.grid.plugin.DragDrop', { ddGroup:'ddTree', //拖放组的名称 dragGroup :'userlist', //拖拽组名称 dropGroup :'userlist' //释放租名称 enableDrag:true, //是否启用 enableDrop:true })] }
- 处理事件
listeners: { drop: function(node, data, dropRec, dropPosition) { var st = this.getStore(); for(i=0;i<st.getCount();i++){ st.getAt(i).set('index',i+1); } } }
- 注意:配置有变化
- 分页组件Ext.toolbar.Paging
dockedItems: [{ xtype: 'pagingtoolbar', store: store, dock: 'bottom', displayInfo: true }],
- 第二种分页的形式
Ext.Loader.setPath('Ext.ux', '../../../extjs4/examples/ux'); Ext.require([ 'Ext.ux.data.PagingMemoryProxy', 'Ext.ux.SlidingPager' ]); bbar: Ext.create('Ext.PagingToolbar', { pageSize: 10, store: store, displayInfo: true, plugins: Ext.create('Ext.ux.SlidingPager', {}) ---- 重点 })
- 第二种分页的形式
- 属性配置框面板Ext.grid.property.Grid
- 做自动生成功能时可以考虑用
- 关于表格的其他东西
- 列锁定
- {text:”age”,dataIndex:’age’,width:100,locked:true},
- 复杂表头
{ text:'other',columns:[ {text:"age",dataIndex:'age',width:100,locked : true}, {text:"int",dataIndex:'index',width:100}] }
- 字段过滤
Ext.require([ 'Ext.ux.grid.FiltersFeature' ]); //创建类 Ext.define("AM.class.filters",{ alias: 'widget.filters', ftype: 'filters', encode: false, local: true, filters: [{ type: 'boolean', dataIndex: 'visible' } ] }) //view层中添加 features: [Ext.create("AM.class.filters")], 列中{filterable: true,text:"age",dataIndex:'age',width:100,filter: {type: 'numeric'}},
- 列锁定
- 代码
- app.js
Ext.onReady(function(){ Ext.QuickTips.init(); Ext.Loader.setConfig({ enabled:true }); Ext.Loader.setPath('Ext.ux', '../../../extjs4/examples/ux'); Ext.require([ 'Ext.ux.data.PagingMemoryProxy', 'Ext.ux.SlidingPager', 'Ext.ux.grid.FiltersFeature' ]); Ext.application({ name : 'AM', appFolder : "app", launch:function(){ Ext.create('Ext.container.Viewport', { layout:'auto', items:[{ xtype: 'userlist', title: 'Users' },{ xtype:'proList' }] }); }, controllers:[ 'Users' ] }); })
- controller/Users.js
Ext.define('AM.controller.Users', { extend: 'Ext.app.Controller', init:function(){ this.control({ 'userlist':{ edit:function(editor,e,options){ //Model //e.record.commit(); } }, 'userlist button[id=save]':{ click:function(o){ var gird = o.ownerCt.ownerCt; var st = gird.getStore(); st.sync();//数据与后台同步 var records = st.getUpdatedRecords(); Ext.Array.each(records,function(model){ model.commit(); }); } }, 'userlist button[id=delete]':{ click:function(o){ var gird = o.ownerCt.ownerCt; var data = gird.getSelectionModel().getSelection(); if(data.length == 0){ Ext.Msg.alert("提示","您最少要选择一条数据"); }else{ //1.先得到ID的数据(name) var st = gird.getStore(); var ids = []; Ext.Array.each(data,function(record){ ids.push(record.get('name')); }) //2.后台操作(delet) Ext.Ajax.request({ url:'/extjs/extjs!deleteData.action', params:{ids:ids.join(",")}, method:'POST', timeout:2000, success:function(response,opts){ Ext.Array.each(data,function(record){ st.remove(record); }) } }) //3.前端操作DOM进行删除(ExtJs) } } } }); }, views:[ 'proerty', 'List' ], stores :[ "Users" ], models :[ "User" ] });
- model/User.js
Ext.define('AM.model.User', { extend: 'Ext.data.Model', fields: [ {name: 'name', type: 'string',sortable : true}, {name: 'age', type: 'int',sortable : true}, {name: 'email', type: 'string',sortable : true}, {name: 'index', type: 'int',sortable : true} ] });
- store/Users.js
Ext.define('AM.store.Users', { extend: 'Ext.data.Store', model: 'AM.model.User', storeId: 's_user', proxy:{ type:'ajax', url:'/extjs/extjs!getUserList.action', reader: { type: 'json', root: 'topics' },writer:{ type:'json' } }, autoLoad: true });
- view/List.js
Ext.define("AM.view.List",{ extend:'Ext.grid.Panel', title : 'Grid Demo',//标题 alias: 'widget.userlist', frame : true,//面板渲染 width : 500, height: 380, columns : [ //列模式 //{text:"Name",dataIndex:'name',width:100,locked:true}, {text:"Name",dataIndex:'name',width:100}, //{text:'others',columns:[ {text:"age",dataIndex:'age',width:100,filterable: true,filter: {type: 'numeric'}}, {text:"email",dataIndex:'email',width:250, field:{ xtype:'textfield', allowBlank:false } },{ text:'index',dataIndex:'index',width:100 } //]} ], features: [Ext.create("AM.util.filters")], tbar :[ {xtype:'button',text:'添加',iconCls:'table_add'}, {xtype:'button',id:'delete',text:'删除',iconCls:'table_remove'}, {xtype:'button',text:'修改',iconCls:'table_edit'}, {xtype:'button',text:'查看',iconCls:'table_comm'}, {xtype:'button',text:'save',id:'save',iconCls:'table_comm'} ], dockedItems :[{ xtype:'pagingtoolbar', store:'Users', dock:'bottom', displayInfo:true, plugins: Ext.create('Ext.ux.SlidingPager', {}) }], //plugins:[ // Ext.create("Ext.grid.plugin.CellEditing",{ // clicksToEdit : 2 // }) // Ext.create('Ext.grid.plugin.RowEditing', { // clicksToEdit: 1 // }) //], viewConfig:{ plugins:[ Ext.create('Ext.grid.plugin.DragDrop', { ddGroup:'ddTree', //拖放组的名称 dragGroup :'userlist', //拖拽组名称 dropGroup :'userlist', //释放租名称 enableDrag:true, //是否启用 enableDrop:true })], listeners: { drop: function(node, data, dropRec, dropPosition) { var st = this.getStore(); for(i=0;i<st.getCount();i++){ st.getAt(i).set('index',i+1); } } } }, //selType:'checkboxmodel',//设定选择模式 //multiSelect:true,//运行多选 store : 'Users', initComponent:function(){ this.callParent(arguments); } });
- view/dd.js
Ext.define("AM.view.dd",{ extend:'Ext.grid.plugin.DragDrop', alias: 'widget.dd', ddGroup:'ddTree', dragGroup :'userlist', dropGroup :'userlist', initComponent:function(){ this.callParent(arguments); } })
- view/proerty.js
Ext.define("AM.view.proerty",{ extend:'Ext.grid.property.Grid', title: 'Properties Grid', alias: 'widget.proList', width: 300, //自定义渲染的函数 customRenderers :{ 'boy':function(value){ return value?'是':'否' }, 'emial-width':function(value){ return value; } }, source: { 'boy':false, 'emial-width':'100' } })
- util/filters.js
Ext.define("AM.util.filters",{ alias: 'widget.filters', ftype: 'filters', encode: false, local: true, filters: [{ type: 'boolean', dataIndex: 'visible' } ] })
- app.js
tree组件
- 类结构
- Ext.panel.Panel
- Ext.panel.Table
- Ext.tree.Panel
- 和grid完全一样
- Ext.tree.Panel
- Ext.panel.Table
- Ext.panel.Panel
- 快速实现一个demo
- 主要配置项
- title、width、height、renderTo
- root 控制根节点(Ext.data.Model/Ext.data.NodeInterface)
- animate : Boolean 控制收起和展开是否有动画效果
- store: store 数据集合
- 重要事件
- itemclick
- 主要配置项
- Ext.data.TreeStore
- 代码
- app.js
Ext.onReady(function(){ Ext.QuickTips.init(); Ext.Loader.setConfig({ enabled:true }); Ext.application({ name : 'AM', appFolder : "app", launch:function(){ Ext.create('Ext.container.Viewport', { layout:'auto', items: { xtype: 'deptTree' } }); }, controllers:[ 'deptController' ] }); })
- controller/deptController.js
Ext.define('AM.controller.deptController', { extend: 'Ext.app.Controller', init:function(){ this.control({ "deptTree button[id=allopen]":{ click:function(b,e){ var tree = b.ownerCt.ownerCt; tree.expandAll(); } }, "deptTree button[id=allclose]":{ click:function(b,e){ var tree = b.ownerCt.ownerCt; tree.collapseAll(); } }, "deptTree button[id=add]":{ click:function(b,e){ var tree = b.ownerCt.ownerCt; var nodes = tree.getChecked(); if(nodes.length == 1){ var node = nodes[0]; node.appendChild({ checked:true, text:'技术架构组', id : '0103', leaf:true }); }else{ alert("请您选择一个节点"); } } }, "deptTree":{ itemclick:function(tree,record,item,index,e,options){ alert(record.get('id')); } } }); }, views:[ 'deptView' ], stores :[ 'deptStore' ], models :[ ] });
- store/deptStore.js
Ext.define("AM.store.deptStore",{ extend:'Ext.data.TreeStore', defaultRoodId:'root', proxy:{ type:'ajax', url:'/extjs/extjs!getDept.action', reader:'json', autoLoad:true } });
- view/deptView.js
Ext.define("AM.view.deptView",{ extend:'Ext.tree.Panel', alias: 'widget.deptTree', title : '部门树形', width : 250, height: 300, padding : '5 3 3 10', rootVisible : false,//控制显隐的属性 dockedItems:[{ xtype:'toolbar', dock:'left', //ui:'footer', items:[ {xtype:'button',text:'add',id:'add'}, {xtype:'button',text:'copy',id:'copy'}, {xtype:'button',text:'delete',id:'delete'} ] },{ xtype:'toolbar', items:[{ xtype:'button', id:'allopen', text:'展开全部' },{ xtype:'button', id:'allclose', text:'收起全部' }] }], store:'deptStore' // root:{ // text:'root', // id : '0', // leaf:false, // children:[{ // text:'技术部门', // checked:false, // id : '01', // leaf:false, // children:[{ // checked:false, // text:'研发部', // id : '0101', // leaf:true // },{ // checked:false, // text:'实施部', // id : '0102', // leaf:true // }] // },{ // text:'后勤部门', // id : '02', // checked:false, // leaf:false, // children:[{ // text:'人事部', // id : '0201', // checked:false, // leaf:true // },{ // text:'行政部', // id : '0202', // checked:false, // leaf:true // }] // }] // } });
- app.js
- 树形的拖拽
- Ext.tree.ViewDDPlugin
- alias: ‘plugin.treeviewdragdrop’,
viewConfig:{ plugins :{ ptype:'treeviewdragdrop' } },
- alias: ‘plugin.treeviewdragdrop’,
- 事件
listeners: { drop: function(node, data, dropRec, dropPosition) {}, beforedrop:function(node,data,overModel,dropPosition,dropFunction,options ){ } }
- 模拟拷贝和黏贴
- 删除操作
- 多列树
- 单击树形根节点子节点也被选中
- Ext.tree.ViewDDPlugin
-
- 代码
- app.js
Ext.onReady(function(){ Ext.QuickTips.init(); Ext.Loader.setConfig({ enabled:true }); Ext.application({ name : 'AM', appFolder : "app", launch:function(){ Ext.create('Ext.container.Viewport', { layout:'auto', items: { xtype: 'deptTree' } }); }, controllers:[ 'deptController' ] }); })
- controller/deptController.js
Ext.define('AM.controller.deptController', { extend: 'Ext.app.Controller', init:function(){ this.control({ 'deptTree':{ checkchange : function(node,checked,options){ if(node.data.leaf == false){//不是叶子 if(checked){ //打开节点 node.expand(); //遍历孩子 node.eachChild(function(n){ n.data.checked = true; n.updateInfo({checked:true}); }) }else{ node.expand(); node.eachChild(function(n){ n.data.checked = false; n.updateInfo({checked:false}); }) } }else{//单击叶子 if(!checked){ node.parentNode.data.checked = false; node.parentNode.updateInfo({checked:false}); } } } }, 'deptTree button[id=delete]':{ click:function(b,e){ var tree = b.ownerCt.ownerCt; var nodes = tree.getChecked(); for(i=0;i<nodes.length;i++){ nodes[i].remove(true); } } }, 'deptTree button[id=copy]':{ click:function(b,e){ var tree = b.ownerCt.ownerCt; //得到数据集合 var nodes = tree.getChecked(); if(nodes.length>0){ //把数据放到剪切板中 tree.setCopyNodes(Ext.clone(nodes)); alert("拷贝"+nodes.length+"个节点"); for(i=0;i<nodes.length;i++){ nodes[i].data.checked = false; nodes[i].updateInfo(); } } } }, "deptTree button[id=paste]":{ click:function(b,e){ var tree = b.ownerCt.ownerCt; //被追加孩子的节点集合 var checkednodes = tree.getChecked(); if(checkednodes.length == 1){ //被追加孩子的节点 var node = checkednodes[0]; //去剪切板中区数据 var nodes = tree.getCopyNodes(); if(nodes.length>0){ for(i=0;i<nodes.length;i++){ var n = nodes[i].data; n['id'] = n['id']+'1'; node.appendChild(n); } } }else{ alert("剪切板中无数据或者你没有选择要追加孩子的节点"); } } }, "deptTree button[id=allopen]":{ click:function(b,e){ var tree = b.ownerCt.ownerCt; tree.expandAll(); } }, "deptTree button[id=allclose]":{ click:function(b,e){ var tree = b.ownerCt.ownerCt; tree.collapseAll(); } }, "deptTree button[id=add]":{ click:function(b,e){ var tree = b.ownerCt.ownerCt; var nodes = tree.getChecked(); if(nodes.length == 1){ var node = nodes[0]; node.appendChild({ checked:true, text:'技术架构组', id : '0103', leaf:true }); }else{ alert("请您选择一个节点"); } } }//, // "deptTree":{ // itemclick:function(tree,record,item,index,e,options){ // alert(record.get('id')); // } // } }); }, views:[ 'deptView' ], stores :[ 'deptStore' ], models :[ 'deptModel' ] });
- model/deptModel.js
Ext.define('AM.model.deptModel', { extend: 'Ext.data.Model', fields: [ {name: 'text', type: 'string',sortable : true}, {name: 'id', type: 'string',sortable : true} ] });
- store/deptStore.js
Ext.define("AM.store.deptStore",{ extend:'Ext.data.TreeStore', defaultRoodId:'root', model:'AM.model.deptModel', proxy:{ type:'ajax', url:'/extjs/extjs!getDept.action', reader:'json', autoLoad:true } });
- view/deptView.js
Ext.define("AM.view.deptView",{ extend:'Ext.tree.Panel', alias: 'widget.deptTree', title : '部门树形', width : 350, height: 300, padding : '5 3 3 10', rootVisible : false,//控制显隐的属性 config:{ copyNodes:''//他充当剪切板的作用 }, columns:[ { xtype:'treecolumn', text:'text', writh:150, dataIndex:'text' },{ text:'info', dataIndex:'id' } ], viewConfig:{ plugins :{ ptype:'treeviewdragdrop', appendOnly : true }, listeners:{ drop:function( node, data, overModel, dropPosition, options){ //ajax的操作把数据同步到后台数据库 alert("把: "+data.records[0].get('text')+" 移动到: "+overModel.get('text')); }, beforedrop:function( node, data, overModel, dropPosition, dropFunction, options){ // if(overModel.get("leaf")){ // overModel.set('leaf',false) // } } } }, dockedItems:[{ xtype:'toolbar', dock:'left', items:[ {xtype:'button',text:'add',id:'add'}, {xtype:'button',text:'copy',id:'copy'}, {xtype:'button',text:'delete',id:'delete'}, {xtype:'button',text:'paste',id:'paste'} ] },{ xtype:'toolbar', items:[{ xtype:'button', id:'allopen', text:'展开全部' },{ xtype:'button', id:'allclose', text:'收起全部' }] }], store:'deptStore' });
tree+grid 部门管理案例
- 简单布局应用
- border布局、tab布局、fit布局
- 表格的操作
- 列表的CRUD
- 控制树形节点的CRUD
- 树形的操作
- 自身的一些功能
- 过滤grid的数据
- 制作流程
- 整体框架搭建
- 表格视图搭建
- 表格CRUD
- 树形视图搭建
- 树形功能实现
- tree和grid整合
- 完善
- 公共函数的抽取
- 完成保存操作
- 完成批量删除操作
- 进一步完善添加操作
- 解决网友提出后台一个pojo前台就要写一个model的问题(缓存,工厂,Ajax)
- 树形过滤表格(伪代码和思路)
- 代码
- app.js
Ext.onReady(function(){ Ext.QuickTips.init(); Ext.Loader.setConfig({ enabled:true }); Ext.application({ name : 'AM', appFolder : "app", launch:function(){ Ext.create('Ext.container.Viewport', { padding : "15 15 15 15", items: { width: 750, height: 530, xtype: 'mainlayout' } }); }, controllers:[ 'DeptController' ] }); })
- controller/DeptController.js
/** * ClassName 部门管理控制器 */ Ext.define("AM.controller.DeptController",{ extend:'Ext.app.Controller', GridDoActionUtil:Ext.create("AM.util.GridDoActionUtil"), init: function(){ this.gerGridObj = function(buttion){ return buttion.ownerCt.ownerCt; }; this.getTreeObj = function(buttion){ return buttion.ownerCt.ownerCt.ownerCt.ownerCt .child('#west-tree').child("#dept-tree"); }; this.control({ 'depTree':{ itemclick:function(tree,record,item,e,opti){ /** * 1.得到单击节点的ID * 2.发到后台重新查询数据load表盒 where id="A0" * 3.oracle 那就用递归查询 * http://www.uspcat.com/myknowledgebase/oracle/oracl_digui.htm */ //alert(record.get("id")) /** * 1.得到节点ID和子节点的ID * 2.发到后台重新查询数据load表盒 where id in ("A0","A01010"); */ record.collapse(function(){ return true; },function(node){ console.log(node); }) //grid.load({whereSql:'in ('A0')'}) } }, 'deptlist button[id=delete]':{ click:function(deleteButton){ var grid = this.gerGridObj(deleteButton); var tree = this.getTreeObj(deleteButton); this.GridDoActionUtil.doDelete(grid,tree); } }, //第二讲中修改 'deptlist button[id=save]':{ click:function(saveButton){ var grid = this.gerGridObj(saveButton); var tree = this.getTreeObj(saveButton); this.GridDoActionUtil.doSave(grid,tree); } }, //设定列表添加按钮的事件 'deptlist button[id=add]':{ click:function(addButton){ //得到数据表格的对象 var grid = this.gerGridObj(addButton); var modelObj = { text: '', id: 'A01', info :'', orderIndex:0, manager:'', nodeType:'ROOT', leaf : true }; //得到tree var tree = this.getTreeObj(addButton); this.GridDoActionUtil.doInsert(grid,modelObj,tree); } } }) }, views:[ 'DeptTree', 'DeptList', 'MainLayout' ], stores:[ 'DeptStore4Tree', 'DeptStore' ], models:[ //'DeptModel' ] });
- model/DeptModel.js(停用)
/** * ClassName 部门的实体 * text : 部门的名称 * id : id主键 * info : 信息 * orderIndex : 排序字段 * manager : 部门的经理 * nodeType : 节点类型 * leaf : 是否叶子 */ Ext.define("AM.model.DeptModel",{ extend:'Ext.data.Model', fields:[ {name:'text',type:'string'}, {name:'id',type:'string'}, {name:'info',type:'string'}, {name:'orderIndex',type:'int'}, {name:'manager',type:'string'}, {name:'nodeType',type:'string'}, {name:'leaf',type:'string'} ] });
- store/DeptStore.js
/** * ClassName 部门实体数据集 */ Ext.define("AM.store.DeptStore",{ extend:'Ext.data.Store', //model:'AM.model.DeptModel', model : modelFactory.getModelByName("AM.model.DeptModel"), proxy:{ api:{ update:'/extjs/extjs!updateDeptList.action', remove:'/extjs/extjs!updateDeptList.action' }, type:'ajax', url:'/extjs/extjs!readDeptForGrid.action', reader:{ type:'json', root:'topics' }, writer:{ type:'json' } }, autoLoad:true });
- store/DeptStore4Tree.js
Ext.define("AM.store.DeptStore4Tree",{ extend:'Ext.data.TreeStore', defaultRootId : 'root', proxy:{ type:'ajax', url:'/extjs/extjs!readDeptTree.action', reader:'json' } });
- view/DeptList.js
/** * ClassName 部门管理数据列表视图 */ Ext.define("AM.view.DeptList",{ extend:'Ext.grid.Panel', alias:'widget.deptlist', store:'DeptStore', width:540, height:400, selModel:{ selType:'checkboxmodel' }, border:0, multiSelect: true, frame:true, tbar:[ {xtype:'button',text:'添加',id:'add',iconCls:'table_add'}, {xtype:'button',text:'删除',id:'delete',iconCls:'table_remove'}, {xtype:'button',text:'保存',id:'save',iconCls:'table_save'} ], dockedItems:[{ xtype:'pagingtoolbar', store:'DeptStore', dock:'bottom', displayInfo:true }], enableKeyNav:true, columnLines: true, columns:[ {text:'部门名称',dataIndex:'text',width:100, field:{ xtype:'textfield', allowBlank:false } }, {text:'部门经理',dataIndex:'manager',width:100, field:{ xtype:'textfield', allowBlank:false } }, {text:'顺序排序',dataIndex:'orderIndex',width:100}, {text:'只能简介',dataIndex:'info',width:100} ], initComponent:function(){ this.editing = Ext.create("Ext.grid.plugin.CellEditing"); this.plugins = [this.editing]; this.callParent(arguments) } });
- view/DeptTree.js
Ext.define("AM.view.DeptTree",{ extend:'Ext.tree.Panel', alias:'widget.depTree', rootVisible:false,//不展示ROOT displayField:'text', animate:false, store:'DeptStore4Tree' })
- view/MainLayout.js
Ext.define("AM.view.MainLayout",{ extend:'Ext.panel.Panel', alias:'widget.mainlayout', defaults:{ split:true, bodyStyle:'padding:1px' }, layout:'border', items:[{ title:'部门树形', region:'west', iconCls:'dept_tree', xtype:'panel', margins:'5 2 5 5', width: 200, collapsible:true,//可以被折叠 id:'west-tree', layout:'fit', items:[{ xtype:'depTree', id:'dept-tree' }] },{ title:'部门数据表格', iconCls:'dept_table', region:'center', xtype:'panel', id:'center-grid', margins:'5 5 5 0', layout:'fit', items:[{ id:'dept-grid', xtype:'deptlist' }] }] });
- comm/ModelFactory.js
/** * 工厂类 */ Ext.define("AM.model.modelFactory",{ //数据类模型的集合 models:new Ext.util.MixedCollection(), //字段集合 fields:new Ext.util.MixedCollection(), getModelByName:function(modelName){ //1.声明类,返回类的ClassName if(this.models.containsKey(modelName)){ return modelName; }else{ //ajax拿到我们的字段集合 var fields = []; if(this.fields.containsKey(modelName)){ fields = this.fields.containsKey(modelName) }else{ Ext.Ajax.request({ url:'/extjs/extjs!getModelFields.action?modelName='+modelName, method:'POST', timeout:4000, async:false,//跟关键 我不需要异步操作 success:function(response,opts){ fields = eval(response.responseText); } }); } this.fields.add(modelName,fields); var newModel = Ext.define(modelName,{ extend:'Ext.data.Model', fields:fields }); this.models.add(modelName,newModel); return modelName; } } }); var modelFactory = Ext.create('AM.model.modelFactory',{});
- util/GridDoActionUtilview.js
Ext.define("AM.util.GridDoActionUtil",{ doDelete:function(grid,treeObj){ if(!grid){ alert("参数传递不正确"); return; } //得到数据集合 var store = grid.getStore(); var records = grid.getSelectionModel().getSelection(); var data = []; Ext.Array.each(records,function(model){ data.push(Ext.JSON.encode(model.get('id'))); }); if(data.length > 0){ Ext.Ajax.request({ url:store.getProxy().api['remove'], params:{data:"["+data.join(",")+"]"}, method:'POST', timeout:4000, success:function(response,opts){ Ext.Array.each(records,function(model){ //tree删除节点 var node = treeObj.getStore().getNodeById(model.get('id')); var parentNode = node.parentNode; try{ node.remove(true); if(parentNode){ if(!parentNode.getChildAt(0)){ parentNode.data['leaf'] = true; parentNode.updateInfo(); } } }catch(e){ console.log(e); } //表格删除数据 store.remove(model); }) } }) } }, /** * 列表的批量修改 * @param {} grid * @param {} treeObj */ doSave:function(grid,treeObj){ if(!grid){ alert("参数传递不正确"); return; } //得到数据集合 var store = grid.getStore(); //records 被你修改过的数据 var records = store.getUpdatedRecords(); var data = []; Ext.Array.each(records,function(model){ data.push(Ext.JSON.encode(model.data)); }); //异步的操作数据 // store.getProxy().update(new Ext.data.Operation({ // action:'update' // })); if(data.length > 0){ Ext.Ajax.request({ url:store.getProxy().api['update'], params:{data:"["+data.join(",")+"]"}, method:'POST', timeout:4000, success:function(response,opts){ console.log(response.responseText); Ext.Array.each(records,function(model){ var node = treeObj.getStore().getNodeById(model.get('id')); node.data['text'] = model.get('text'); node.updateInfo(); //取消小箭头 model.commit(); }); } }); } }, /** * 树形维护表格的插入操作 * @param {} grid * @param {} modelObj * @param {} treeObj */ doInsert:function(grid,modelObj,treeObj){ if(!(grid && modelObj)){ alert("参数传递不正确"); return; } //得到表格数据集合 var store = grid.getStore(); //得到目前表格的数据集合长度 var storeCount = store.getCount(); //得到编辑插件 var edit = grid.editing; //得到数据模型 var model = store.model; if(storeCount == 0){//证明添加的节点是ROOT //初始化一个模型的类 var deptObj = new model(modelObj); edit.cancelEdit();//取消其他插件的编辑活动 store.insert(0,deptObj); edit.startEditByPosition({ row:0, column:1 }); if(treeObj){//我们需要树形操作 var rootNode = treeObj.getStore().getRootNode(); rootNode.appendChild({ id:modelObj["id"], text:modelObj["text"], leaf:modelObj["leaf"] }); } }else{ //得到被选择的数据集合 var checkedRecords = grid.getSelectionModel().getSelection(); if(checkedRecords.length == 1){ var parentRecord = checkedRecords[0]; modelObj['nodeType'] = 'GENERAL'; //第二讲中改******************************** modelObj['id'] = 'A010101'; //得到父节点 var parentNode = treeObj.getStore().getNodeById(parentRecord.get('id')); try{ parentNode.data['leaf'] = false; parentNode.updateInfo(); //给它加一个孩子节点 parentNode.appendChild({ id:"A010101", text:'', leaf:true }); parentNode.expand(); }catch(e){ } edit.cancelEdit();//取消其他插件的编辑活动 var deptObj = new model(modelObj); store.insert(0,deptObj); edit.startEditByPosition({ row:0, column:1 }); }else{ alert("请选择1个父级部门,您现在选择的是["+checkedRecords.length+"]个"); } } } });
- resources/css/dept.css
.dept_table{ background-image: url(/Learning-extjs4.0/lesson/18/resources/img/dept_table.png) !important; } .dept_tree{ background-image: url(/Learning-extjs4.0/lesson/18/resources/img/dept_tree.png) !important; } .table_remove{ background-image: url(/Learning-extjs4.0/lesson/18/resources/img/table_remove.gif) !important; } .table_add{ background-image: url(/Learning-extjs4.0/lesson/18/resources/img/table_add.png) !important; } .table_save{ background-image: url(/Learning-extjs4.0/lesson/18/resources/img/tabel_save.png) !important; }
- app.js
form组件
- 根类 Ext.form.Basic
- 提供了表单组件,字段管理,数据验证,表单提交,数据加载的功能
- 表单的容器 Ext.form.Panel
- 容器自动关联Ext.form.Basic的实例对象更方便的进行字段的配置
- 重要属性
- defaultType:”” 设置默认子项 的xtype
- 数据交互和加载
- Ext.form.action.Action
- Ext.form.action.Submit ajax方式提交
- Ext.form.action.StandardSubmit 原始表单提交方法
- Ext.form.action.DirectLoad
- Ext.form.action.DirectSubmit 指令式的模式
- Ext.form.action.Submit ajax方式提交
- Ext.form.action.Action
- 字段的控制
- Ext.form.field.Base 是跟类
- 混入了类 [Ext.form.field.Field]得到表单值的处理功能
- 混入了类[Ext.form.Labelable]得到表单标签错误信息提示的功能
- Ext.form.field.Text 文本框方式的
- Ext.form.field.TextArea
- Ext.form.field.Trigger 触发器
- Ext.form.field.Picker 选择器
- Ext.form.field.Time
- Ext.form.field.Date
- Ext.form.field.Number
- Ext.form.field.File 文件上传的
- Ext.form.field.ComboBox 选择框
- Ext.form.field.Picker 选择器
- Ext.form.field.Checkbox 选择框方式的
- Ext.form.field.Radio 单选框
- Ext.form.field.Hidden 特殊的-隐藏字段
- Ext.form.field.HtmlEditor 特殊的-文本编辑框
- Ext.form.field.Base 是跟类
- 其中夹杂布局的类
- Ext.form.FieldContainer
- Ext.form.CheckboxGroup
- Ext.form.RadioGroup
- Ext.form.CheckboxGroup
- Ext.form.Label
- Ext.form.Labelable
- Ext.form.FieldSet
- Ext.form.FieldContainer
- Ext.form.FieldContainer
- 实例讲解
- Ext.form.Panel
- 重要的配置项
- title:’‘,bodyStyle:’‘,frame : ,height: ,width :,
- renderTo:’‘,defaultType:’‘,defaults:{}
- 由于混入了Ext.form.Labelable,可以配置
- labelSeparator 字段名字和值的分割符号、labelWidth 标签宽度
- 重要的配置项
- Ext.form.field.Text 文本框(xtype: textfield)
- 重要的配置项
- width : 150,allowBlank: false, //不能是空
- labelAlign :’left’,msgTarget:’side’//在字段的右面展示数据
- 重要的配置项
- Ext.form.field.TextArea
- getValues()用法
- Ext.form.Panel
- 代码
Ext.onReady(function(){ //------------------------------------- Ext.define("person",{ extend:'Ext.data.Model', fields:[ {name:'userName',type:'auto'}, {name:'password',type:'auto'} ] }); var p = new person({userName:'yunfengcheng2008@126.com',password:"123456"}); //------------------------------------- var passTest = /[123]/i Ext.apply(Ext.form.field.VTypes,{ myPass :function(val,field){ return passTest.test(val); }, myPassText:"密码格式错误", myPassMask:/[123]/i }); //------------------------------------- var textForm = Ext.create("Ext.form.Panel",{ title : "form中文本框实例", bodyStyle :'padding:5 5 5 5', frame : true, height : 120, width : 300, id:'my_form', renderTo:'formDemo', defaultType:'textfield', defaults:{ labelSeparator :": ", labelWidth : 50, width : 200, allowBlank: false, msgTarget : 'side', labelAlign:'left' }, items:[{ fieldLabel : "Name", name:'userName', id:'userName', selectOnFocus : true, regex:/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/, regexText:"请用邮箱来注册", grow:false//是否在这个表单字段规定长度内自动根据文字的内容进行伸缩 },{ fieldLabel : "Pass", name:'password', id:'password', inputType:'password', vtype:'myPass' }], buttons: [ {text:'登陆系统',handler:function(b){ //我没想通过base来得到数值,那我们就要先得到base //那么base我们有什么办法来的到呢? //很简单 通过 Ext.form.Basic(findField( String id ) : void) //那么Ext.form.Basic如何得到呢? //很简单Ext.form.Panel (getForm( )) //Ext.form.Panel如何得到呢? //很简单 1>通过ID来的 var formObj = Ext.getCmp("my_form"); var basic = formObj.getForm(); var nameField = basic.findField("userName"); var nameValue = nameField.getValue(); alert(nameValue); }},{ text:'重置',handler:function(b){ var formObj = Ext.getCmp("my_form"); var basic = formObj.getForm(); basic.reset(); } },{ text:'装在数据',handler:function(b){ var formObj = Ext.getCmp("my_form"); var basic = formObj.getForm(); basic.loadRecord(p); } } ] }) });
- 数字框
- CheckBox,radio
- CheckGroup,RadioGroup
- Trigger 触发器字段
- 他指派了一个没有任何动作的接触按钮,需要给他加上不同的动作
- TextArea.js
Ext.onReady(function(){ var textFomr = Ext.create("Ext.form.Panel",{ title : "form中文本框大文本的实例", bodyStyle :'padding:5 5 5 5', frame : true, height : 250, width : 400, id:'my_form', renderTo:'formDemo', defaultType:'textfield', defaults:{ labelSeparator :": ", labelWidth : 50, width : 200, allowBlank: false, msgTarget : 'side', labelAlign:'left' }, items:[{ fieldLabel:'Name', name:'userName', id:'userName', selectOnFocus:true },{ xtype:'textareafield', width:300, height:150, name:'info', fieldLabel:'Info' }], buttons: [ {text:'登陆系统',handler:function(b){ var formObj = Ext.getCmp("my_form"); var basic = formObj.getForm(); console.log(basic.getValues()); }}] }) })
- number.js
Ext.onReady(function(){ var textFomr = Ext.create("Ext.form.Panel",{ title : "form中文本框数字框的实例", bodyStyle :'padding:5 5 5 5', frame : true, height : 250, width : 400, id:'my_form', renderTo:'formDemo', defaultType:'numberfield', defaults:{ labelSeparator :": ", labelWidth : 80, width : 200, allowBlank: false, msgTarget : 'side', labelAlign:'left' }, items:[{ fieldLabel:'整数微调', allowDecimals:false,//叫你不能输入小数 name:'num1', id:'num1' },{ fieldLabel:'整数', allowDecimals:false,//叫你不能输入小数 name:'num2', id:'num2', hideTrigger : true },{ fieldLabel:'小数', name:'num3', id:'num3', emptyText :'请输入小数', hideTrigger : false, decimalPrecision:3 },{ fieldLabel:'定界小数', name:'num3', id:'num3', minValue:10, maxValue:100, emptyText :'请输入小数', hideTrigger : false, decimalPrecision:3 },{ fieldLabel:'输入限定', name:'num4', id:'num4', baseChars:'01', hideTrigger : true },{ fieldLabel:'限定步长', name:'num5', id:'num5', step:0.8, hideTrigger : false, value:'20' },{ fieldLabel:'只读字段', name:'num6', id:'num6', step:0.8, hideTrigger : false, value:'20', //readOnly:true disabled : true }], buttons: [ {text:'登陆系统',handler:function(b){ var formObj = Ext.getCmp("my_form"); var basic = formObj.getForm(); console.log(basic.getValues()); }}] }) })
- checkbox.js
Ext.onReady(function(){ var textFomr = Ext.create("Ext.form.Panel",{ title : "form中文本框选框的实例", bodyStyle :'padding:5 5 5 5', frame : true, height : 250, width : 400, id:'my_form', renderTo:'formDemo', defaults:{ labelSeparator :": ", labelWidth : 50, width : 200, allowBlank: false, msgTarget : 'side', labelAlign:'left' }, items:[{ xtype:'radiofield', boxLabel :'男', inputValue:'m', fieldLabel:'性别', checked:true, name:'sex' },{ xtype:'radiofield', boxLabel :'女', inputValue:'w', fieldLabel:'性别', name:'sex' },{ xtype:'checkboxfield', inputValue:'1', name:'hobby', boxLabel:'唱歌', fieldLabel:'爱好' },{ xtype:'checkboxfield', inputValue:'2', name:'hobby', boxLabel:'看书', fieldLabel:'爱好' },{ xtype:'checkboxfield', inputValue:'3', name:'hobby', checked:true, boxLabel:'编程', fieldLabel:'爱好' },{ xtype:'checkboxfield', inputValue:'4', name:'hobby', boxLabel:'交友', fieldLabel:'爱好' }], dockedItems:[{ xtype:'toolbar', dock:'top', items:[{ text:'选择全部的爱好', iconCls:'table_comm', handler:function(){ var formObj = Ext.getCmp("my_form"); var basic = formObj.getForm(); var fields = basic.getFields(); fields.each(function(field){ if("hobby" == field.getName()){ field.setValue(true) } }) } }] }], buttons: [ {text:'登陆系统',handler:function(b){ var formObj = Ext.getCmp("my_form"); var basic = formObj.getForm(); console.log(basic.getValues()); }}] }) })
- checkboxgroup.js
Ext.onReady(function(){ var textFomr = Ext.create("Ext.form.Panel",{ title : "form中文本框选框的实例", bodyStyle :'padding:5 5 5 5', frame : true, height : 250, width : 400, id:'my_form', renderTo:'formDemo', defaults:{ labelSeparator :": ", labelWidth : 50, width : 200, allowBlank: false, msgTarget : 'side', labelAlign:'left' }, items:[{ xtype:'radiogroup', fieldLabel:'性别', columns:2, items:[{ xtype:'radiofield', boxLabel :'男', inputValue:'m', checked:true, name:'sex' },{ xtype:'radiofield', boxLabel :'女', inputValue:'w', name:'sex' }] },{ xtype:'checkboxgroup', fieldLabel:'爱好', width:335, columns:4, items:[{ xtype:'checkboxfield', inputValue:'1', name:'hobby', boxLabel:'唱歌' },{ xtype:'checkboxfield', inputValue:'2', name:'hobby', boxLabel:'看书' },{ xtype:'checkboxfield', inputValue:'3', name:'hobby', checked:true, boxLabel:'编程' },{ xtype:'checkboxfield', inputValue:'4', name:'hobby', boxLabel:'交友' }] }], dockedItems:[{ xtype:'toolbar', dock:'top', items:[{ text:'选择全部的爱好', iconCls:'table_comm', handler:function(){ var formObj = Ext.getCmp("my_form"); var basic = formObj.getForm(); var fields = basic.getFields(); fields.each(function(field){ if("hobby" == field.getName()){ field.setValue(true) } }) } }] }], buttons: [ {text:'登陆系统',handler:function(b){ var formObj = Ext.getCmp("my_form"); var basic = formObj.getForm(); console.log(basic.getValues()); }}] }) })
- Trigger.js
Ext.onReady(function(){ var textFomr = Ext.create("Ext.form.Panel",{ title : "form中文本框触发器的实例", bodyStyle :'padding:5 5 5 5', frame : true, height : 250, width : 400, id:'my_form', renderTo:'formDemo', defaults:{ labelSeparator :": ", labelWidth : 50, width : 200, allowBlank: false, msgTarget : 'side', labelAlign:'left' }, items:[{ xtype:'triggerfield', fieldLabel:'Name', name:'userName', id:'userName', onTriggerClick:function(e){ var formObj = Ext.getCmp("my_form"); var basic = formObj.getForm(); console.log(basic.getValues()); } }] }) })
- comboBox组件
- Ext.form.field.ComboBox
- Ext.view.BoundList 约束列表
- 本地下拉框
- Time
- Date
- comboBox组件
- combobox.js
Ext.onReady(function(){ Ext.QuickTips.init(); //部门类 Ext.define("department",{ extend:'Ext.data.Model', fields:[ {name:'name'}, {name:'id'} ] }); var st = Ext.create("Ext.data.Store",{ model:'department', data:[ {name:'销售部',id:'001'}, {name:'人事部',id:'002'}, {name:'研发部',id:'003'}, {name:'产品部',id:'004'}, {name:'实施部',id:'0`05'}, {name:'法务部',id:'006'} ] }); Ext.create("Ext.form.Panel",{ title:'本地combobox实例', renderTo:'formDemo', bodyPadding:'5 5 5 5', height:100, width:270, frame:true, defaults:{ labelSeparator :": ", labelWidth : 70, width : 200, allowBlank: false, msgTarget : 'side', labelAlign:'left' }, items:[{ xtype:'combobox', listConfig:{//控制下拉列表的样式 emptyText:'没有找到匹配的数值', maxHeight:200 }, fieldLabel:'选择部门', name:'post', queryMode:'local',//[local|remot] store:st, valueField:"id", displayField :'name', forceSelection:true,//不运行使用数据集合中没有的数值 typeAhead : true, value:'001' }] }); });
- date.js
Ext.onReady(function(){ Ext.QuickTips.init(); Ext.create("Ext.form.Panel",{ title:'本地combobox实例', renderTo:'formDemo', bodyPadding:'5 5 5 5', height:100, width:270, frame:true, defaults:{ labelSeparator :": ", labelWidth : 70, width : 200, allowBlank: false, msgTarget : 'side', labelAlign:'left' }, items:[{ xtype:'datefield', fieldLabel:'工作日', minValue:'01/01/2011', maxValue:'31/12/2011', disabledDays :[0,6], disabledDates:['11年11月08日'], disabledDatesText:'这个日期你不能选择' }] }); });
- synccombobox.js
Ext.onReady(function(){ Ext.QuickTips.init(); //部门类 Ext.define("department",{ extend:'Ext.data.Model', fields:[ {name:'name'}, {name:'id'}, {name:'c'} ] }); var st = Ext.create("Ext.data.Store",{ model:'department', pageSize:4, proxy:{ type:'ajax', url:'/extjs/extjs!getComboBox.action' } }); Ext.create("Ext.form.Panel",{ title:'本地combobox实例', renderTo:'formDemo', bodyPadding:'5 5 5 5', height:100, width:470, frame:true, defaults:{ labelSeparator :": ", labelWidth : 70, width : 300, allowBlank: false, msgTarget : 'side', labelAlign:'left', pageSize:4 }, items:[{ xtype:'combobox', listConfig:{//控制下拉列表的样式 emptyText:'没有找到匹配的数值', maxHeight:200, getInnerTpl :function(){ return "<div class='{c}'>{name}.{id}</div>"; } }, fieldLabel:'城市', name:'post', queryMode:'remot',//[local|remot] store:st, valueField:"id", minChars:1, triggerAction :'all', queryDelay : 400, queryParam:'whereSql', multiSelect:true,//允许多选 displayField :'name'//, //forceSelection:true,//不运行使用数据集合中没有的数值 //typeAhead : true, //value:'001' }] }); });
- time.js
Ext.onReady(function(){ Ext.QuickTips.init(); Ext.create("Ext.form.Panel",{ title:'本地combobox实例', renderTo:'formDemo', bodyPadding:'5 5 5 5', height:100, width:270, frame:true, defaults:{ labelSeparator :": ", labelWidth : 70, width : 200, allowBlank: false, msgTarget : 'side', labelAlign:'left' }, items:[{ xtype:'timefield', fieldLabel:'上班时间', minValue:'9:00', maxValue:'18:00', minText:'时间要大于{0}', maxText:'时间要小于{0}', format:'G时', increment:60, invalidText:'时间格式错误', pickerMaxHeight :100 }] }); });
- Ext.form.field.Hidden
- Ext.form.field.HtmlEditor
- Ext.form.field.Display 就是为了展示的字段
- Ext.form.Label
- Ext.form.FieldSet
- Ext.form.FieldContainer
- Ext.form.field.File
- FieldContainer.js
Ext.onReady(function(){ Ext.QuickTips.init(); Ext.create("Ext.form.Panel",{ title:'本地FieldContainer实例', renderTo:'formDemo', bodyPadding:'5 5 5 5', height:100, width:570, defaults:{ msgTarget : 'side', labelAlign:'left' }, frame:true, items: [{ xtype: 'fieldcontainer', fieldLabel: '人员信息', combineErrors : true,//是否合并展示错误信息 combineLabels: true,//合并展示标签的信息,配合其他使用 labelConnector :',', layout: { type:'hbox',//横排布局(这个起了关键性在作用) align:'middle'//垂直居中 }, fieldDefaults:{ hideLabel:true,//以藏label allowBlank:false//不允许是空 }, defaultType:'textfield', items: [{ xtype:'label', forId:'name', text:'姓名' },{ fieldLabel: 'name',//虽然被隐藏但是很有用(展示错误信息) name: 'name', inputId:'name' },{ xtype:'label', forId:'photo', text:'电话' },{xtype: 'displayfield', value: ' ( '},{ name: 'photo', fieldLabel: 'photo', inputId:'photo' },{xtype: 'displayfield', value: ' ) '}] }], buttons: [{ text: '提交', handler: function() { //up的源码讲解 this.up('form').getForm().submit({ params: { info: 'age是隐藏字段' } }); } }] }); });
- cosupload.jsp
<%@ page language="java" contentType="text/html; charset=GBk" pageEncoding="GBK"%> <%@ page import="java.util.*" %> <%@ page import="java.io.*" %> <%@ page import="com.hd.util.RandomFileRenamePolicy" %> <%@page import="com.oreilly.servlet.*"%> <% //---------------------------------------- //---------------------------------------- String root = request.getSession().getServletContext().getRealPath("/"); String savePath = root + "file-library\\"; int maxPostSize = 3 * 5 * 1024 * 1024; RandomFileRenamePolicy frp = new RandomFileRenamePolicy(); MultipartRequest multi = new MultipartRequest(request, savePath, maxPostSize, "utf-8",frp); String fieldIds = ""; //取得所有已上传文件的名字,返回枚举类型。 Enumeration filesName = multi.getFileNames(); //遍历返回的枚举类型,COS可以上传多个文件,当表单中有多个文本域标签时,使用while关键字遍历. long l = 0L; String fileType = null; String fileName = null; while(filesName.hasMoreElements()){ //当发现枚举类型中包含文件对象,获取文件对象在枚举中的名字 String fname = (String)filesName.nextElement(); //通过名字获取文件,返回java文件对象 File file = multi.getFile(fname); //判断是否获得到文件 if(file != null){ //获取文件的真实名字(以便能存储到数据库中) fileName = multi.getFilesystemName(fname); fileType = fileName.substring(fileName.lastIndexOf(".")+1); RandomAccessFile raFile = new RandomAccessFile(new File(savePath+fileType+"\\"+fileName),"r"); l = raFile.length(); fieldIds = fieldIds + fileName+","; } } fieldIds = fieldIds.substring(0,fieldIds.length()-1); response.setContentType("text/html;charset=GBK"); response.getWriter().print("{'address':'"+RandomFileRenamePolicy.fp+"','docName':'"+RandomFileRenamePolicy.fn+"','fileType':'"+fileType+"','docCode':'"+fileName+"','size':'"+l+"','success':true,'message':'上传成功','ids':'"+fieldIds+"'}"); %>
- Display.js
Ext.onReady(function(){ Ext.QuickTips.init(); Ext.create("Ext.form.Panel",{ title:'本地Display实例', renderTo:'formDemo', bodyPadding:'5 5 5 5', height:100, width:270, frame:true, defaults:{ labelSeparator :": ", labelWidth : 70, width : 200, allowBlank: false, msgTarget : 'side', labelAlign:'left' }, items:[{ xtype:'displayfield', name:'name', value:'uspcat.com', fieldLabel:'展示' }], buttons:[{ text:'提交', handler:function(){ this.up("form").getForm().submit({ params:{ info:'age是隐藏字段' } }); } }] }); })
- FieldContainer.js
Ext.onReady(function(){ Ext.QuickTips.init(); Ext.create("Ext.form.Panel",{ title:'本地FieldContainer实例', renderTo:'formDemo', bodyPadding:'5 5 5 5', height:100, width:500, frame:true, defaults:{ msgTarget:'side', labelAlign:'left' }, items:[{ xtype:'fieldcontainer', layout:{ type:'hbox', align:'middle' }, combineLabels:true, combineErrors:true, fieldDefaults:{ hideLabel:true,//默认字段会隐藏lebel allowBlank:false }, defaultType:'textfield', items:[{ xtype:'label', forId:'name', text:'姓名' },{ fieldLabel:'name', name:'name', inputId:'name' },{ xtype:'label', forId:'phone', text:'电话' },{ fieldLabel:'phone', name:'phone', inputId:'phone' }] }], buttons:[{ text:'提交', handler:function(){ this.up("form").getForm().submit({ params:{ info:'age是隐藏字段' } }); } }] }); })
- FieldSet.js
Ext.onReady(function(){ Ext.QuickTips.init(); Ext.create("Ext.form.Panel",{ title:'本地FieldSet实例', renderTo:'formDemo', bodyPadding:'5 5 5 5', height:300, width:270, frame:true, items:[{ title:'组合', xtype:'fieldset', collapsible:true,//可以展示伸缩的按钮 defaultType:'textfield', defaults:{ anchor:'95%' }, layout:'anchor', items:[{ fieldLabel:'Name', name:'name' },{ fieldLabel:'Email', name:'Email' }] },{ title:'组合2', xtype:'fieldset', checkboxToggle:true,//启用复选框 collapsible:true,//可以展示伸缩的按钮 defaultType:'textfield', collapsed:true,//true默认set是收起的 defaults:{ anchor:'95%' }, layout:'anchor', items:[{ fieldLabel:'PASS', name:'PASS' },{ fieldLabel:'INFO', name:'INFO' }] }], buttons:[{ text:'提交', handler:function(){ this.up("form").getForm().submit({ params:{ info:'age是隐藏字段' } }); } }] }); })
- File.js
Ext.onReady(function(){ Ext.QuickTips.init(); Ext.create("Ext.form.Panel",{ title:'本地File实例', renderTo:'formDemo', bodyPadding:'5 5 5 5', height:100, width:270, frame:true, items:[{ xtype:'filefield', name:'photo', fieldLabel:'照片', labelWidth:50, msgTarget:'side', allowBlank:false, anchor:'98%', buttonText:'请选中文件' }], buttons:[{ text:'提交', handler:function(){ this.up("form").getForm().submit({ url:'/platform/assistJsp/upload/cosupload.jsp', waitMsg:'文件上传中', success:function(){ Ext.Msg.alert("success","文件上传成功"); } }); } }] }); })
- hidden.js
Ext.onReady(function(){ Ext.QuickTips.init(); Ext.create("Ext.form.Panel",{ title:'本地hiddenfield实例', renderTo:'formDemo', bodyPadding:'5 5 5 5', height:100, width:270, frame:true, defaults:{ labelSeparator :": ", labelWidth : 70, width : 200, allowBlank: false, msgTarget : 'side', labelAlign:'left' }, items:[{ xtype:'textfield', name:'name', fieldLabel:'name', value:'USPCAT.COM' },{ xtype:'hiddenfield', name:'age', value:'1' }], buttons:[{ text:'提交', handler:function(){ this.up("form").getForm().submit({ params:{ info:'age是隐藏字段' } }); } }] }); })
- HtmlEditor.js
Ext.onReady(function(){ Ext.QuickTips.init(); Ext.create("Ext.form.Panel",{ title:'本地htmleditor实例', renderTo:'formDemo', bodyPadding:'5 5 5 5', height:400, width:600, frame:true, items:[{ xtype:'htmleditor', name:'HTML', height:320, width:580, fontFamilies :['宋体','黑体','楷体'], defaultLinkValue :'http://www.uspcat.com' }], buttons:[{ text:'提交', handler:function(){ this.up("form").getForm().submit({ params:{ info:'age是隐藏字段' } }); } }] }); })
- Label.js
Ext.onReady(function(){ Ext.QuickTips.init(); Ext.create("Ext.form.Panel",{ title:'本地Label实例', renderTo:'formDemo', bodyPadding:'5 5 5 5', height:100, width:270, frame:true, items:[{ xtype:'label', name:'name', text:'展示', forId :'myname', overCls:'a' },{ xtype:'textfield', name:'age', value:'1', inputId:'myname', hideLabel:true }] }); })
- 从Grid中装载数据 basic.loadRecord(Model);
- 服务器装载数据
- 异步装载
- 表单的提交操作
- Ajax提交数据
- 传统方式提交
- load.js
Ext.onReady(function(){ Ext.QuickTips.init(); Ext.create("Ext.form.Panel",{ title:'本地load实例', renderTo:'formDemo', bodyPadding:'5 5 5 5', height:300, width:400, frame:true, defaults:{ labelSeparator :": ", labelWidth : 70, width : 300, allowBlank: false, msgTarget : 'side', labelAlign:'left' }, items:[{ fieldLabel:'ID', xtype:'textfield', name:'userId', value:'001'//硬编码写值 },{ fieldLabel:'NAME', xtype:'textfield', name:'userName', value:'uspcat.com'//硬编码写值 },{ fieldLabel:'AGE', xtype:'numberfield', name:'userAge', value:'1'//硬编码写值 },{ xtype:'textareafield', width:300, height:150, name:'info', fieldLabel:'INFO' }], buttons:[{ text:'提交数据', handler:function(){ //得到form var basic = this.up("form").getForm(); basic.submit({ clientValidation: true,//要经过客户端验证的 url: '/extjs/extjs!getFormValues.action', method:'POST', success:function(){ Ext.Msg.alert('提示',"提交数据"); } }); } },{ text:'加载远程数据', handler:function(){ //得到form var basic = this.up("form").getForm(); //得到userId var userId = basic.findField("userId").getValue(); basic.load({ params:{userId:userId}, url:'/extjs/extjs!getFormValues.action', method:'POST', success:function(form,action){ Ext.Msg.alert('提示',"加载成功"); }, failure:function(form,action){ Ext.Msg.alert('提示',"失败原因是: "+action.result.errorMessage); } }); } }] }); });
panel与layout
- 面板
- 类结构
- Ext.Base
- Ext.AbstractComponent
- Ext.Component
- Ext.container.AbstractContainer
- Ext.container.Container
- Ext.panel.AbstractPanel
- Ext.panel.Panel (是以前版本的Ext.Panel类)
- Ext.panel.AbstractPanel
- Ext.container.Container
- Ext.container.AbstractContainer
- Ext.Component
- Ext.AbstractComponent
- Ext.Base
- 常见的子类
- Ext.window.Window 控制窗口
- Ext.form.Panel 控制form
- Ext.panel.Table 控制grid
- Ext.tab.Panel 控制工具条
- Ext.menu.Menu 控制菜单
- Ext.tip.Tip
- Ext.container.ButtonGroup
- 组成面板的部件
- 底部工具栏,顶部工具栏,面板头部,面板底部,面板体
- 类结构
- 布局
- Auto自动布局[Ext.layout.container.Auto]
- 组件没有指定任何布局方式的时候Auto布局就是默认的布局方式
- 他采用最原始的HTML流式排版的布局方式
- Fit自适应布局[Ext.layout.container.Fit]
- 他是他的(第一个也是唯一个)子元素填满自身的body
- Accordion折叠(手风琴)布局[Ext.layout.container.Accordion]
- 他是初始化多个版面,当一个版面处于打开状态下,其他版面就会处于收起状态
- Card卡片布局[Ext.layout.container.Card]
- 和折叠布局不同之处在于他是自定义按钮来切换
- Anchor锚点布局[Ext.layout.container.Anchor]
- 根据容器的大小为其子元素进行的布局和定位
- 百分比
- 偏移量
- 参考边
- 根据容器的大小为其子元素进行的布局和定位
- Absolute绝对定位[Ext.layout.container.Absolute]
- 多选框布局Ext.layout.container.CheckboxGroup
- Column列布局[Ext.layout.container.Column]
- 列风格布局,每一列的宽度可以根据百分比或者固定数值来控制
- Table表格布局[Ext.layout.container.Table]
- 和传统的HTML布局方式一样的布局使用方法
- Border边界布局[Ext.layout.container.Border]
- 可以控制上,下,左,右,中
- 盒布局
- Ext.layout.container.Box
- Ext.layout.container.VBox 竖排(竖直盒)
- Ext.layout.container.HBox 横排(水平盒)
- 主要参数
- Box
- flex 具有配置flex的子项,会根据占有总量的比之来决定自己的大小
- pack 控制子元素展示位置[start左面(这时候flex生效),center(中间),end(右面)]
- padding 边距
- HBox
- align[top,middle,stretch,stretchmax]
- VBox
- align[left,center,stretch,stretchmax]
- Box
- Ext.tab.Panel
- 选项卡布局
- 特殊(他不在布局的包下面)
- Auto自动布局[Ext.layout.container.Auto]
- panel.js
Ext.onReady(function(){ Ext.QuickTips.init(); Ext.create('Ext.panel.Panel',{ title: '[01]面板的头部[Ext.panel.Header]', width: 500, bodyPadding : 10,//边距 height: 400, hideCollapseTool:false, collapsible :true, //animCollapse : false,//控制动画 //frame : true,//渲染面板 autoLoad:'/Learning-extjs4.0/lesson/26/ass.html',//只要是不是null自动加载内容 html: '<p>[02]面板体</p>',//和上面的属性是冲突的 autoScroll:true,//自动滚动条 closable:true,//运行客户关闭 closeAction:'destroy',//设置关闭动作[destroy|hide] bodyStyle: { background: '#ffc' }, renderTo: 'demo', tbar: [ { xtype: 'button', text: '[03]顶部工具栏' } ], bbar: [ { xtype: 'button', text: '[04]底部工具栏 ' } ], dockedItems: [{ xtype: 'toolbar', dock: 'bottom', ui: 'footer', items: [ { xtype: 'component', flex: 1 }, { xtype: 'button', text: '[05]面板底部', handler:function(b){ b.up("panel").removeAll(true)//自动销毁 } } ] }], tools:[{ type:'refresh', qtip: '刷新' },{ type:'help', qtip: '帮助' },{ id:'next', handler: function(event, toolEl, panel){ panel.up("panel").insert(0,{ xtype:'panel', width:100, height:100, bodyStyle: { background: 'red' } }) } }] }); }); /** close、collapse、down、expand、gear、help、left、maximize、minimize minus、move、next、pin、plus、prev、print、refresh、resize、restore right、save、search、toggle、unpin、up */
- auto.js
Ext.onReady(function(){ Ext.QuickTips.init(); Ext.create('Ext.Panel', { width: 800, height: 280, title: "AutoLayout布局的面板", layout: 'auto',//设置布局 renderTo: 'demo', items: [{ xtype: 'panel', title: '第一个面板', width: '75%', //站总体宽度的75% height: 90 },{ xtype: 'panel', title: '第二个面板', width: '75%', height: 90 },{ xtype: 'panel', title: '第三个面板', width: '99%', height: 90 }] }); })
- fit.js
Ext.onReady(function(){ Ext.QuickTips.init(); Ext.create('Ext.Panel', { width: 500, height: 280, title: "AutoLayout布局的面板", layout: 'fit',//设置布局 renderTo: 'demo', items: [{ xtype: 'panel', title: '第一个面板' },{ xtype: 'panel', title: '第二个面板' }] }); })
- Accordion.js
Ext.onReady(function(){ Ext.QuickTips.init(); Ext.create('Ext.panel.Panel', { title: 'Accordion布局', width: 300, height: 300, layout:'accordion', defaults: { bodyStyle: 'padding:15px' }, layoutConfig: { titleCollapse: false, animate: true, activeOnTop: true }, items: [{ title: 'Panel 1', html: '面板1' },{ title: 'Panel 2', html: '面板2' },{ title: 'Panel 3', html: '面板3' }], renderTo: 'demo' }); });
- card.js
Ext.onReady(function(){ Ext.QuickTips.init(); var navigate = function(panel, direction,btn){ var layout = panel.getLayout(); layout[direction](); //next(),prev() //card的关键函数next( ) : Ext.Component,prev( ) : Ext.Component //getNext( ) : Ext.Component,getPrev( ) : Ext.Component Ext.getCmp('move-prev').setDisabled(!layout.getPrev()); Ext.getCmp('move-next').setDisabled(!layout.getNext()); }; Ext.create('Ext.Panel', { width: 500, height: 280, layout: 'card',//设置布局 activeItem:0,//默认展示的子节点索引 renderTo: 'demo', items: [{ id: 'card-0', xtype: 'panel', title: '第一个面板', html:'第一个面板' },{ id: 'card-1', xtype: 'panel', title: '第二个面板', html:'第二个面板' },{ id: 'card-3', xtype: 'panel', title: '第三个面板', html:'第三个面板' }], index:1,//自定义索引 titleInfo: "cardt布局的面板", listeners: { render:function(){ var panel = this; panel.setTitle(panel.titleInfo+"("+(this.activeItem+1)+"/"+panel.items.length+")"); } }, bbar: [{ id: 'move-prev', text: '上一页', handler: function(btn) { var panel = btn.up("panel"); panel.index = panel.index-1; panel.setTitle(panel.titleInfo+"("+panel.index+"/"+panel.items.length+")"); navigate(panel, "prev"); }, disabled: true }, '->', { id: 'move-next', text: '下一页', handler: function(btn) { var panel = btn.up("panel"); panel.index = panel.index+1; panel.setTitle(panel.titleInfo+"("+panel.index+"/"+panel.items.length+")"); navigate(panel, "next"); } } ] }); })
- anchor.js
Ext.onReady(function(){ Ext.QuickTips.init(); Ext.create('Ext.Panel', { width: 500, height: 500, title: "Anchor布局的面板", layout: 'anchor',//设置布局 renderTo: 'demo', items: [{ xtype: 'panel', title: '75% 宽 and 20% 高', anchor: '75% 20%' },{ xtype: 'panel', title: '偏移量 -300 宽 & -200 高', anchor: '-300 -200' },{ xtype: 'panel', title: '综合使用 -250 宽 20% 高', anchor: '-250 20%' }] }); })
- Absolute.js
Ext.onReady(function(){ Ext.QuickTips.init(); Ext.create('Ext.Panel', { width: 200, height: 200, title: "absolute布局的面板", layout: 'absolute',//设置布局 renderTo: 'demo', items:[{ title: '子面板', x: 50, y: 50, width: 100, height: 100, html: '定位在 x:50, y:40' }] }); })
- column.js
Ext.onReady(function(){ Ext.QuickTips.init(); Ext.create('Ext.Panel', { width: 1000, height: 200, title: "column布局的面板", layout: 'column',//设置布局 renderTo: 'demo', items: [{ title: '宽 = (总宽度-250)*25%', columnWidth: .25,//这个布局特有的写法 html: 'Content' },{ title: '宽 = (总宽度-250)*75%', columnWidth: .75, html: 'Content' },{ title: '宽 = 250px', width: 250, html: 'Content' }] }); })
- Table.js
Ext.onReady(function(){ Ext.QuickTips.init(); Ext.create('Ext.Panel', { width: 400, height: 230, title: "table布局的面板", layout: { type:'table', columns:4//四列 },//设置布局 defaults:{ width: 100, height: 100, frame:true }, renderTo: 'demo', items: [{ title: "1", width:300,//这个布局特有的写法 colspan: 3//跨三列 },{ title: '2', height:200, rowspan:2//跨两行 },{ title: '3' },{ title: '4' },{ title: '5' }] }); })
- Border.js
Ext.onReady(function(){ Ext.QuickTips.init(); Ext.create('Ext.container.Viewport', {//一般是这样配合使用的 //width: 1000, //height: 800, //renderTo: Ext.getBody(), title: "table布局的面板", layout:'border', defaults: { collapsible: true, split: true, bodyStyle: 'padding:15px' }, items: [{ title: '上面north', region: 'north', height: 100, cmargins: '5 0 0 0' },{ title: '下面south', region: 'south', height: 150, minSize: 75, maxSize: 250, cmargins: '5 0 0 0' },{ title: '左面west', region:'west', margins: '5 0 0 0', cmargins: '5 5 0 0', width: 175, minSize: 100, maxSize: 250 },{ title: '中间Content', collapsible: false, region:'center', margins: '5 0 0 0' },{ title: '右面east', width: 175, region:'east', margins: '5 0 5 5' }] }); })
- Box.js
Ext.onReady(function(){ Ext.QuickTips.init(); Ext.create('Ext.Panel', { width: 400, height: 230, renderTo: Ext.getBody(), title: "Vbox布局的面板", layout: { type: 'vbox', align : 'stretch', pack : 'start' }, items: [ {html:'panel 1', flex:1}, {html:'panel 2', height:150}, {html:'panel 3', flex:2} ] }); })
- tab.js
Ext.onReady(function(){ Ext.QuickTips.init(); Ext.create('Ext.tab.Panel', { width: 400, height: 230, renderTo: Ext.getBody(), items: [{ title: '第一个选项卡' }, { title: '第二个选项卡' }], buttons:[{ text:'增加选项卡', handler:function(btn){ var panel = btn.up("tabpanel"); var index = panel.items.length+1; var tabPage = panel.add({ title: '第'+index+'个选项卡', html:'我新添加的tab', closable:true }); panel.setActiveTab(tabPage);//启用激活他 } }] }); })
chart
- 图表分为坐标轴(axes)和图表序列(series)
- axes 轴
- 数值轴 Ext.chart.axis.Numeric
- 时间轴 Ext.chart.axis.Time
- 分类轴 Ext.chart.axis.Category
- 仪表轴 Ext.chart.axis.Gauge
- series 图表序列
highlight高亮,label标题,tips提示,renderer格式化- 折线图 Ext.chart.series.Line
- 柱形图 Ext.chart.series.Column
- 饼状图 Ext.chart.series.Pie
- 条形图 Ext.chart.series.Bar
- 面积图 Ext.chart.series.Area
- 雷达图 Ext.chart.series.Radar 略
- 散点图 Ext.chart.series.Scatter 略
- 仪表图 Ext.chart.series.Gauge
- axes 轴
- Numeric.js
var dataStore = Ext.create("Ext.data.Store",{ fields:[ 'name','data' ], data:[ {name:'0~10岁',data:120}, {name:'11~18岁',data:170}, {name:'19~24岁',data:175} ] }); var b1 = Ext.create("Ext.Window",{ width:600, height:500, title:'年龄身高分布图', shadow:false, maximizable:true, layout:'fit', items:[{ xtype:'chart', style:'background:#fff',//控制背景颜色 animate :true,//运行动画 shadow : true, theme:"Category1",//皮肤 store:dataStore, axes:[{ type:'Numeric', position:'left',//放置到左边 dashSize:5,//引导线的宽度设置 title:'身高分布(CM)', fields:['data'],//显示的数据索引 majorTickSteps:5, minorTickSteps:6, grid:{ odd:{//奇数行 opacity:1,//不透明 'stroke-width':0.5//表格线宽 }, even:{//偶数行 opacity:1,//不透明 stroke:'#DDD', 'stroke-width':0.5//表格线宽 } } },{ type:'Category', position:'bottom', fields:['name'], title:'年龄段', grid:true }],//轴 series:[{ type:'line', axis:'left', xField: 'name', yField: 'data', highlight:true, tips:{ trackMouse: true, width: 140, height: 28, renderer: function(storeItem, item) { this.setTitle(storeItem.get('name') + ': ' + storeItem.get('data') + 'CM'); } } }]//序列 }] });
- Column.js
//定义数据集合 var columnStore1 = Ext.create('Ext.data.JsonStore', { fields: ['name', 'data'], data: [ {name:"0~10岁",data:20}, {name:"11~18岁",data:60}, {name:"19~24岁",data:30} ] }); var b2 = Ext.create('Ext.Window', { width: 800, height: 600, hidden: false, closeAction:'hide', maximizable: true, title: '柱形图展示图表', layout: 'fit', tbar: [{ text: '改变数据', handler: function() { columnStore1.loadData([ {name:"0~10岁",data:50}, {name:"11~18岁",data:30}, {name:"19~24岁",data:20} ]); } }], items: { id: 'chartCmp', xtype: 'chart', style: 'background:#fff', animate: true, shadow: true, store: columnStore1, axes: [{//轴 type: 'Numeric', position: 'left', fields: ['data'], title: '人数', grid: true, minimum: 0 }, { type: 'Category', position: 'bottom', fields: ['name'], title: '年龄段' }],//序列 series: [{ type: 'column', axis: 'left', highlight: true, tips: {//提示 trackMouse: true, width: 140, height: 28, renderer: function(storeItem,item) { this.setTitle(storeItem.get('name') + ': ' + storeItem.get('data') + ' 名'); } }, //格式化 renderer: function(sprite, record, attr, index, store){ var fieldValue = Math.random() * 20 + 10; var value = (record.get('data') >> 0) % 3; var color = ['rgb(213, 70, 121)', 'rgb(44, 153, 201)', 'rgb(146, 6, 157)', 'rgb(49, 149, 0)', 'rgb(249, 153, 0)'][value]; return Ext.apply(attr, { fill: color }); } , label: { //控制柱形图label display: 'insideEnd', 'text-anchor': 'middle', field: 'data', renderer: Ext.util.Format.numberRenderer('0'), orientation: 'vertical', color: '#333' }, xField: 'name', yField: 'data' }] } });
- line.js
//定义数据集合 var columnStore2 = Ext.create('Ext.data.JsonStore', { fields: ['name', 'data1','data2','data3','data4'], data: [ {name:"一月月考",data1:85,data2:76,data3:94,data4:80}, {name:"二月月考",data1:96,data2:72,data3:87,data4:63}, {name:"三月月考",data1:70,data2:66,data3:68,data4:78}, {name:"四月月考",data1:90,data2:78,data3:76,data4:90} ] }); var b3 = Ext.create('Ext.Window', { width: 800, height: 600, hidden: false, maximizable: true, closeAction:'hide', title: 'Line Chart', renderTo: Ext.getBody(), layout: 'fit', tbar: [{ text: '产看另外一个人的成绩', handler: function() { columnStore2.loadData([ {name:"一月月考",data1:75,data2:86,data3:84,data4:90}, {name:"二月月考",data1:86,data2:62,data3:87,data4:93}, {name:"三月月考",data1:80,data2:96,data3:68,data4:98}, {name:"四月月考",data1:60,data2:98,data3:76,data4:60} ]); } }], items: { xtype: 'chart', style: 'background:#fff', animate: true, store: columnStore2, shadow: true,//阴影 // mask: 'horizontal',//创建遮罩 // listeners: {//配合遮罩用的隐藏 // select: { // fn: function(me, selection) { // //me.setZoom(selection); // me.mask.hide(); // } // } // }, theme: 'Category1', legend: { position: 'right' }, axes: [{//轴 type: 'Numeric', minimum: 0, position: 'left', fields: ['data1', 'data2', 'data3', 'data4'], title: '分数', minorTickSteps: 1,//内部去也的跨度 grid: { odd: { opacity: 1, fill: '#ddd', stroke: '#bbb', 'stroke-width': 0.5 } } }, { type: 'Category', position: 'bottom', fields: ['name'], title: '历次考试' }], series: [{//序列1 type: 'line', highlight: { size: 7, radius: 7 }, axis: 'left', xField: 'name', yField: 'data1',//展示在图例上的 title :'语文', markerConfig: {//标记配置 type: 'cross',//交叉 size: 4, radius: 4, 'stroke-width': 0 } },{//序列2 type: 'line', highlight: { size: 7, radius: 7 }, axis: 'left', xField: 'name', yField: 'data2', title :'数学', markerConfig: { type: 'cross', size: 4, radius: 4, 'stroke-width': 0 } }, { type: 'line', highlight: { size: 7, radius: 7 }, axis: 'left',//位置 smooth: true, xField: 'name', yField: 'data3', title :'英语', markerConfig: { type: 'cross', size: 4, radius: 4, 'stroke-width': 0 } }, { type: 'line', highlight: { size: 7, radius: 7 }, axis: 'left', smooth: true, fill: true,//填充颜色 xField: 'name', yField: 'data4', title :'计算机', markerConfig: { type: 'circle',//圈 size: 4, radius: 4, 'stroke-width': 0 } }] } });
- Pie.js
var columnStore5 = Ext.create('Ext.data.JsonStore', { fields: ['name', 'data'], data: [ {name:"0~10岁",data:20}, {name:"11~18岁",data:60}, {name:"19~24岁",data:30} ] }); var b4 = Ext.create('Ext.Window', { width: 800, height: 600, title: '饼图示例', layout: 'fit', closeAction:'hide', tbar: [{ text: '数据变换', handler: function() { columnStore5.loadData([ {name:"0~10岁",data:40}, {name:"11~18岁",data:20}, {name:"19~24岁",data:40} ]); } }, { enableToggle: true, pressed: false, text: 'Donut(设置内圆)', toggleHandler: function(btn, pressed) { var chart = Ext.getCmp('chartCmp'); //设置图标序列的模式 chart.series.first().donut = pressed ? 35 : false;//内弧度 chart.refresh(); } }], items: { xtype: 'chart', id: 'chartCmp', animate: true, store: columnStore5, shadow: true, legend: { position: 'right' }, insetPadding: 60, theme: 'Base:gradients', series: [{ type: 'pie', field: 'data', showInLegend: true, donut: false,//内环状线圈 tips: {//提示 trackMouse: true, width: 140, height: 28, renderer: function(storeItem, item) { var total = 0; columnStore5.each(function(rec) { total += rec.get('data'); }); this.setTitle(storeItem.get('name') + ': ' + Math.round(storeItem.get('data')/total*100) + '%'); } }, highlight: {//高亮 segment: { margin: 20 } }, label: { field: 'name', display: 'rotate', contrast: true, font: '18px Arial' } }] } });
- Bar.js
var columnStore6 = Ext.create('Ext.data.JsonStore', { fields: ['name', 'data'], data: [ {name:"0~10岁",data:122}, {name:"11~18岁",data:163}, {name:"19~24岁",data:234}, {name:"15~35岁",data:737}, {name:"36~42岁",data:453}, {name:"43~60岁",data:540} ] }); var b5 = Ext.create('Ext.Window', { width: 800, height: 600, hidden: false, maximizable: true, title: 'Bar Renderer', renderTo: Ext.getBody(), layout: 'fit', tbar: [{ text: '重新装载数据', handler: function() { columnStore6.loadData( [ {name:"0~10岁",data:221}, {name:"11~18岁",data:363}, {name:"19~24岁",data:135}, {name:"15~35岁",data:432}, {name:"36~42岁",data:756}, {name:"43~60岁",data:649} ]); } }], items: { xtype: 'chart', animate: true, style: 'background:#fff', shadow: false,//阴影 store: columnStore6, axes: [{ type: 'Numeric', position: 'bottom', fields: ['data'], label: { renderer: Ext.util.Format.numberRenderer('0,0') }, title: '人数', minimum: 0 }, { type: 'Category', position: 'left', fields: ['name'], title: '年龄分布' }], series: [{ type: 'bar', axis: 'bottom', label: { display: 'insideEnd', field: 'data1', renderer: Ext.util.Format.numberRenderer('0'), orientation: 'horizontal', color: '#333', 'text-anchor': 'middle', contrast: true }, xField: 'name', yField: ['data'], renderer: function(sprite, record, attr, index, store) { var fieldValue = Math.random() * 20 + 10; var value = (record.get('data') >> 0) % 5; var color = ['rgb(213, 70, 121)', 'rgb(44, 153, 201)', 'rgb(146, 6, 157)', 'rgb(49, 149, 0)', 'rgb(249, 153, 0)'][value]; return Ext.apply(attr, { fill: color }); } }] } });
- area.js
//Ext.onReady(function () { var columnStore7 = Ext.create('Ext.data.JsonStore', { fields: ['name', 'data1','data2','data3','data4'], data: [ {name:"一月月考",data1:85,data2:76,data3:94,data4:80}, {name:"二月月考",data1:96,data2:72,data3:87,data4:63}, {name:"三月月考",data1:70,data2:66,data3:68,data4:78}, {name:"四月月考",data1:90,data2:78,data3:76,data4:90} ] }); var b6 = Ext.create('Ext.Window', { width: 800, height: 600, hidden: false, shadow: false, maximizable: true, title: 'Area Chart', renderTo: Ext.getBody(), layout: 'fit', tbar: [{ text: '切换数据', handler: function() { columnStore7.loadData([ {name:"一月月考",data1:75,data2:86,data3:84,data4:90}, {name:"二月月考",data1:86,data2:62,data3:87,data4:93}, {name:"三月月考",data1:80,data2:96,data3:68,data4:98}, {name:"四月月考",data1:60,data2:98,data3:76,data4:60} ]); } }, { enableToggle: true, pressed: true, text: '动画开启|关闭', toggleHandler: function(btn, pressed) { var chart = Ext.getCmp('chartCmp'); chart.animate = pressed?{easing: 'ease', duration: 500 }:false; } }], items: { id: 'chartCmp', xtype: 'chart', style: 'background:#fff', animate: true, store: columnStore7, legend: { position: 'bottom' }, axes: [{ type: 'Numeric', grid: true, position: 'left',//位置 fields: ['data1', 'data2', 'data3', 'data4'], title: '分数分布', grid: { odd: { opacity: 1, fill: '#ddd', stroke: '#bbb', 'stroke-width': 1 } }, minimum: 0, adjustMinimumByMajorUnit: 0 }, { type: 'Category', position: 'bottom', fields: ['name'], title: '每月考试', grid: true, label: { rotate: { degrees: 315 } } }], series: [{ type: 'area', highlight: false, axis: 'left', xField: 'name', yField: ['data1', 'data2', 'data3', 'data4'], style: { opacity: 0.93 } }] } }); //})
- area.js(加)
Ext.require('Ext.chart.*'); Ext.require('Ext.data.*'); Ext.require('Ext.Window'); Ext.require('Ext.layout.container.Fit'); Ext.require('Ext.fx.target.Sprite'); //规划数据 var jsonData = [ { date: '1/1/2009', IE: 44.8, Firefox: 45.5, Chrome: 3.9, Safari: 3, Opera: 2.3, Other: 0.5 }, { date: '2/1/2009', IE: 43.6, Firefox: 46.4, Chrome: 4, Safari: 3, Opera: 2.2, Other: 0.8 }, { date: '3/1/2009', IE: 43.3, Firefox: 46.5, Chrome: 4.2, Safari: 3.1, Opera: 2.3, Other: 0.6 }, { date: '4/1/2009', IE: 42.1, Firefox: 47.1, Chrome: 4.9, Safari: 3, Opera: 2.2, Other: 0.7 }, { date: '5/1/2009', IE: 41, Firefox: 47.7, Chrome: 5.5, Safari: 3, Opera: 2.2, Other: 0.6 }, { date: '6/1/2009', IE: 40.7, Firefox: 47.3, Chrome: 6, Safari: 3.1, Opera: 2.1, Other: 0.8 }, { date: '7/1/2009', IE: 39.4, Firefox: 47.9, Chrome: 6.5, Safari: 3.3, Opera: 2.1, Other: 0.8 }, { date: '8/1/2009', IE: 39.3, Firefox: 47.4, Chrome: 7, Safari: 3.3, Opera: 2.1, Other: 0.9 }, { date: '9/1/2009', IE: 39.6, Firefox: 46.6, Chrome: 7.1, Safari: 3.6, Opera: 2.2, Other: 0.9 }, { date: '10/1/2009', IE: 37.5, Firefox: 47.5, Chrome: 8, Safari: 3.8, Opera: 2.3, Other: 0.9 }, { date: '11/1/2009', IE: 37.7, Firefox: 47, Chrome: 8.5, Safari: 3.8, Opera: 2.3, Other: 0.7 }, { date: '12/1/2009', IE: 37.2, Firefox: 46.4, Chrome: 9.8, Safari: 3.6, Opera: 2.3, Other: 0.7 }, { date: '1/1/2010', IE: 36.2, Firefox: 46.3, Chrome: 10.8, Safari: 3.7, Opera: 2.2, Other: 0.8 }, { date: '2/1/2010', IE: 35.3, Firefox: 46.5, Chrome: 11.6, Safari: 3.8, Opera: 2.1, Other: 0.7 }, { date: '3/1/2010', IE: 34.9, Firefox: 46.2, Chrome: 12.3, Safari: 3.7, Opera: 2.2, Other: 0.7 }, { date: '4/1/2010', IE: 33.4, Firefox: 46.4, Chrome: 13.6, Safari: 3.7, Opera: 2.2, Other: 0.7 }, { date: '5/1/2010', IE: 32.2, Firefox: 46.9, Chrome: 14.5, Safari: 3.5, Opera: 2.2, Other: 0.7 }, { date: '6/1/2010', IE: 31, Firefox: 46.6, Chrome: 15.9, Safari: 3.6, Opera: 2.1, Other: 0.8 }, { date: '7/1/2010', IE: 30.4, Firefox: 46.4, Chrome: 16.7, Safari: 3.4, Opera: 2.3, Other: 0.8 }, { date: '8/1/2010', IE: 30.7, Firefox: 45.8, Chrome: 17, Safari: 3.5, Opera: 2.3, Other: 0.7 }, { date: '9/1/2010', IE: 31.1, Firefox: 45.1, Chrome: 17.3, Safari: 3.7, Opera: 2.2, Other: 0.6 }, { date: '10/1/2010', IE: 29.7, Firefox: 44.1, Chrome: 19.2, Safari: 3.9, Opera: 2.2, Other: 0.9 }, { date: '11/1/2010', IE: 28.6, Firefox: 44, Chrome: 20.5, Safari: 4.0, Opera: 2.3, Other: 0.6 }, { date: '12/1/2010', IE: 27.5, Firefox: 43.5, Chrome: 22.4, Safari: 3.8, Opera: 2.2, Other: 0.6 } ]; //数据fields数据抽取 var fields = ['IE', 'Chrome', 'Firefox', 'Safari', 'Opera', 'Other']; //创建数据 var browserStore = Ext.create('Ext.data.JsonStore', { fields: fields, data: jsonData }); var colors = ['rgb(47, 162, 223)', 'rgb(60, 133, 46)', 'rgb(234, 102, 17)', 'rgb(154, 176, 213)', 'rgb(186, 10, 25)', 'rgb(40, 40, 40)']; //扩展原始类[Ext.chart.theme.Base]属性colors Ext.chart.theme.Browser = Ext.extend(Ext.chart.theme.Base, { constructor: function(config) { Ext.chart.theme.Base.prototype.constructor.call(this, Ext.apply({ colors: colors }, config)); } }); var b7 = Ext.create('Ext.Window', { width: 800, height: 600, hidden: false, shadow: false, maximizable: false, title: '浏览器使用分布', //renderTo: Ext.getBody(), layout: 'fit', items: { id: 'chartCmp', xtype: 'chart', style: 'background:#fff', animate: true, theme: 'Browser:gradients',//皮肤 defaultInsets: 30, store: browserStore,//数据引用 legend: { position: 'right'//图例的设置 }, axes: [{//轴 type: 'Numeric', position: 'left', fields: fields, title: '使用率 %', grid: true, decimals: 0,//小数进位数值 默认是2 minimum: 0,//设置最小数值,如果没有设置则按章数据的最小数值自动计算 maximum: 100//设置最大数值,如果没有设置则按照数据的最大数值自动计算 }, { type: 'Category',//类型轴 position: 'bottom', fields: ['date'], title: '2011年月度分布', label: { renderer: function(v) { return v.match(/([0-9]*)\/[0-9]*\/[0-9][0-9]([0-9]*)/).slice(1).join('/'); } } }], series: [{ type: 'area',//面积图 axis: 'left', highlight: true,//高亮 tips: {//提示 trackMouse: true, width: 170, height: 28, renderer: function(storeItem, item) { this.setTitle(item.storeField + ' - ' + Ext.Date.format(new Date(storeItem.get('date')), 'M y') + ' - ' + storeItem.get(item.storeField) + '%'); } }, xField: 'name', yField: fields, style: { lineWidth: 1, stroke: '#666', opacity: 0.86 } }] } });
- Gauge.js
var s1 = Ext.create('Ext.data.JsonStore', { fields: ['name', 'data'], data: [ {name:"0~10岁",data:20} ] }); var s2 = Ext.create('Ext.data.JsonStore', { fields: ['name', 'data'], data: [ {name:"0~10岁",data:50} ] }); var s3 = Ext.create('Ext.data.JsonStore', { fields: ['name', 'data'], data: [ {name:"0~10岁",data:30} ] }); var b8 = Ext.create('Ext.Window', { width: 800, height: 250, minWidth: 650, minHeight: 225, title: 'Gauge Charts', tbar: [{ text: '装载新的数据', handler: function() { s1.loadData([ {name:"0~10岁",data:50} ]); s2.loadData([ {name:"0~10岁",data:20} ]); s3.loadData([ {name:"0~10岁",data:70} ]); } }], layout: { type: 'hbox', align: 'stretch' }, items: [{//第一个仪表图 xtype: 'chart', style: 'background:#fff', animate: { easing: 'elasticIn', duration: 1000 }, store: s1, insetPadding: 25, flex: 1, axes: [{ type: 'gauge', position: 'gauge', minimum: 0, maximum: 100, steps: 10, margin: -10 }], series: [{ type: 'gauge', field: 'data', donut: false, colorSet: ['#F49D10', '#ddd'] }] }, {//第二个仪表图 xtype: 'chart', style: 'background:#fff', animate: true, store: s2, insetPadding: 25, flex: 1, axes: [{ type: 'gauge', position: 'gauge', minimum: 0, maximum: 100, steps: 10, margin: 7 }], series: [{ type: 'gauge', field: 'data', donut: 30, colorSet: ['#82B525', '#ddd'] }] }, {//第三个仪表图 xtype: 'chart', style: 'background:#fff', animate: { easing: 'bounceOut', duration: 500 }, store: s3, insetPadding: 25, flex: 1, axes: [{ type: 'gauge', position: 'gauge', minimum: 0, maximum: 100, steps: 10, margin: 7 }], series: [{ type: 'gauge', field: 'data', donut: 80, colorSet: ['#3AA8CB', '#ddd'] }] }] })
- Radar.js
var columnStore9 = Ext.create('Ext.data.JsonStore', { fields: ['name', 'data1','data2','data3','data4'], data: [ {name:"一月月考",data1:85,data2:76,data3:94}, {name:"二月月考",data1:96,data2:72,data3:87}, {name:"三月月考",data1:70,data2:66,data3:68}, {name:"四月月考",data1:50,data2:88,data3:56}, {name:"五月月考",data1:80,data2:88,data3:36}, {name:"六月月考",data1:40,data2:68,data3:96}, {name:"七月月考",data1:60,data2:88,data3:86}, {name:"八月月考",data1:70,data2:88,data3:96}, {name:"九月月考",data1:80,data2:98,data3:66}, {name:"十月月考",data1:90,data2:78,data3:76}, {name:"十一月月考",data1:90,data2:78,data3:76}, {name:"十二月月考",data1:90,data2:78,data3:76} ] }); var b9 = Ext.create('Ext.Window', { width: 800, height: 600, hidden: false, shadow: false, maximizable: true, style: 'overflow: hidden;', title: 'Radar Chart', renderTo: Ext.getBody(), layout: 'fit', tbar: [{ text: '装载数据', handler: function() { columnStore9.loadData( [ {name:"一月月考",data1:75,data2:86,data3:74}, {name:"二月月考",data1:96,data2:82,data3:87}, {name:"三月月考",data1:70,data2:96,data3:68}, {name:"四月月考",data1:50,data2:78,data3:56}, {name:"五月月考",data1:90,data2:88,data3:36}, {name:"六月月考",data1:80,data2:68,data3:96}, {name:"七月月考",data1:60,data2:88,data3:86}, {name:"八月月考",data1:70,data2:98,data3:86}, {name:"九月月考",data1:88,data2:98,data3:66}, {name:"十月月考",data1:70,data2:88,data3:96}, {name:"十一月月考",data1:90,data2:78,data3:76}, {name:"十二月月考",data1:90,data2:98,data3:76} ]); } }, { enableToggle: true, pressed: true, text: 'Animate', toggleHandler: function(btn, pressed) { var chart = Ext.getCmp('chartCmp'); chart.animate = pressed ? { easing: 'ease', duration: 500 } : false; } }], items: { id: 'chartCmp', xtype: 'chart', style: 'background:#fff', theme: 'Category2', animate: true, store: columnStore9, insetPadding: 20, legend: { position: 'right'//图例 }, axes: [{//轴 type: 'Radial', position: 'radial', label: { display: true } }], series: [{ type: 'radar', xField: 'name', yField: 'data1', showInLegend: true,//展示在图例 showMarkers: true, markerConfig: { radius: 5, size: 5 }, style: { 'stroke-width': 2, //fill: 'yellow'//没有填充 fill:'none' } },{ type: 'radar', xField: 'name', yField: 'data2', showInLegend: true, showMarkers: true, markerConfig: { radius: 5, size: 5 }, style: { 'stroke-width': 2, fill: 'none' } },{ type: 'radar', xField: 'name', yField: 'data3', showMarkers: true, showInLegend: true, markerConfig: { radius: 5, size: 5 }, style: { 'stroke-width': 2, fill: 'none' } }] } });
- demo.js
var chart; var generateData = (function() { var data = [], i = 0, last = false, date = new Date(2011, 1, 1), seconds = +date, min = Math.min, max = Math.max, random = Math.random; return function() { data = data.slice(); data.push({ date: Ext.Date.add(date, Ext.Date.DAY, i++), visits: min(100, max(last? last.visits + (random() - 0.5) * 20 : random() * 100, 0)), views: min(100, max(last? last.views + (random() - 0.5) * 10 : random() * 100, 0)), users: min(100, max(last? last.users + (random() - 0.5) * 20 : random() * 100, 0)) }); last = data[data.length -1]; return data; }; })(); var group = false, groupOp = [{ dateFormat: 'M d', groupBy: 'year,month,day' }, { dateFormat: 'M', groupBy: 'year,month' }]; function regroup() { group = !group; var axis = chart.axes.get(1), selectedGroup = groupOp[+group]; axis.dateFormat = selectedGroup.dateFormat; axis.groupBy = selectedGroup.groupBy; chart.redraw(); } var store = Ext.create('Ext.data.JsonStore', { fields: ['date', 'visits', 'views', 'users'], data: generateData() }); //关键函数 var intr = setInterval(function() { var gs = generateData(); var toDate = timeAxis.toDate, lastDate = gs[gs.length - 1].date, markerIndex = chart.markerIndex || 0; if (+toDate < +lastDate) { markerIndex = 1; timeAxis.toDate = lastDate; timeAxis.fromDate = Ext.Date.add(Ext.Date.clone(timeAxis.fromDate), Ext.Date.DAY, 1); chart.markerIndex = markerIndex; } store.loadData(gs); }, 1000); var b10 = Ext.create('Ext.Window', { width: 800, height: 600, hidden: false, maximizable: true, title: 'Live Animated Chart', renderTo: Ext.getBody(), layout: 'fit', items: [{ xtype: 'chart', style: 'background:#fff', id: 'chartCmp', store: store, shadow: false, animate: true, axes: [{ type: 'Numeric', grid: true, minimum: 0, maximum: 100, position: 'left', fields: ['views', 'visits', 'users'], title: 'Number of Hits', grid: { odd: { fill: '#dedede', stroke: '#ddd', 'stroke-width': 0.5 } } }, { type: 'Time', position: 'bottom', fields: 'date', title: 'Day', dateFormat: 'M d', groupBy: 'year,month,day', aggregateOp: 'sum', constrain: true, fromDate: new Date(2011, 1, 1), toDate: new Date(2011, 1, 7), grid: true }], series: [{ type: 'line', smooth: false, axis: 'left', xField: 'date', yField: 'visits', label: { display: 'none', field: 'visits', renderer: function(v) { return v >> 0; }, 'text-anchor': 'middle' }, markerConfig: { radius: 5, size: 5 } },{ type: 'line', axis: 'left', smooth: false, xField: 'date', yField: 'views', label: { display: 'none', field: 'visits', renderer: function(v) { return v >> 0; }, 'text-anchor': 'middle' }, markerConfig: { radius: 5, size: 5 } },{ type: 'line', axis: 'left', smooth: false, xField: 'date', yField: 'users', label: { display: 'none', field: 'visits', renderer: function(v) { return v >> 0; }, 'text-anchor': 'middle' }, markerConfig: { radius: 5, size: 5 } }] }] }); chart = Ext.getCmp('chartCmp'); var timeAxis = chart.axes.get(1);
- demo.js(加)
var columnStore11 = Ext.create('Ext.data.JsonStore', { fields: ['name', 'data'], data: [ {name:"0~10岁",data:20}, {name:"11~18岁",data:60}, {name:"19~24岁",data:30} ] }); var b11 = Ext.create('Ext.Window', { width: 800, height: 600, hidden: false, maximizable: true, title: 'Pie Renderer Chart', renderTo: Ext.getBody(), layout: 'fit', tbar: [{ text: 'Reload Data', handler: function() { columnStore11.loadData([ {name:"0~10岁",data:40}, {name:"11~18岁",data:20}, {name:"19~24岁",data:40} ]); } }], items: { id: 'chartCmp', xtype: 'chart', style: 'background:#fff', animate: true, shadow: true, store: columnStore11, series: [{ type: 'pie', animate: true, angleField: 'data', //角度 lengthField: 'data', //字段切点长度 highlight: { segment: { margin: 20 } }, label: { field: 'name', //文本标注 display: 'rotate', //旋转标签 (also middle, out). font: '14px Arial', contrast: true }, style: { 'stroke-width': 1, 'stroke': '#fff' }, //add renderer renderer: function(sprite, record, attr, index, store) {//格式化重要函数 var value = (record.get('data') >> 0) % 9; var color = [ "#94ae0a", "#115fa6","#a61120", "#ff8809", "#ffd13e", "#a61187", "#24ad9a", "#7c7474", "#a66111"][value]; return Ext.apply(attr, { fill: color }); } }] } });
- Numeric.js
Ext.onReady(function(){ Ext.get("b1").on("click",function(){ b1.show() }) Ext.get("b2").on("click",function(){ b2.show() }) Ext.get("b3").on("click",function(){ b3.show() }) Ext.get("b4").on("click",function(){ b4.show() }) Ext.get("b5").on("click",function(){ b5.show() }) Ext.get("b6").on("click",function(){ b6.show() }) Ext.get("b7").on("click",function(){ b7.show() }) Ext.get("b8").on("click",function(){ b8.show() }) Ext.get("b9").on("click",function(){ b9.show() }) Ext.get("b10").on("click",function(){ b10.show() }) Ext.get("b11").on("click",function(){ b11.show() }) });