Ext.js高级组件

第二章: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返回父级
  • 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',100},
              {text:"age",dataIndex:'age',100},
              {text:"email",dataIndex:'email',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   //自动加载数据
      });
      

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类
  • 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',100},
              {text:"age",dataIndex:'age',100},
              {text:"email",dataIndex:'email',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}
          ]
      });
      

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
  • Ext.grid.column.Date
    • xtype: datecolumn
      • format:’Y年m月的日’
  • Ext.grid.column.Number
    • xtype: numbercolumn
      • format:‘0,000’
  • 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',100},
            {text:"age",dataIndex:'age',100},
            {text:"email",dataIndex:'email',200,
                field:{
                    xtype:'textfield',
                    allowBlank:false
                }
            },{
                text:'sex',
                dataIndex:'sex',
                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",
                50,
                trueText:'是',
                falseText:'不是'
            },{
                text:'birthday',
                dataIndex:'birthday',
                xtype : "datecolumn",
                150,
                format:'Y年m月d日'
            },{
                text:'deposit',
                dataIndex:'deposit',
                xtype:'numbercolumn',
                150,
                format:'0,000'
            },{
                text:'描述',
                xtype:'templatecolumn',
                tpl:'姓名是{name} 年龄是{age}',
                150
            },{
                 text:'Action',
                 xtype:'actioncolumn',
                 id:'delete',
                 icon:'app/view/image/table_delete.png',
                 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})
        • 很实用,选择要特殊处理的数据
  • 多选框选择器Ext.selection.CheckboxModel
    • 重要方法
      • Ext.selection.RowModel
        • 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
          };
          
  • 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); 
        }    
        
  • 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
  • 扩展

    • 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',100},
                      {text:"age",dataIndex:'age',100,
                          summaryType:'average',
                          summaryRenderer: function(value, summaryData, dataIndex) {
                             return Ext.util.Format.number(value,"00.0")
                          }   
                      },
                      {text:"email",dataIndex:'email',200,
                          field:{
                              xtype:'textfield',
                              allowBlank:false
                          }
                      },{
                          text:'sex',
                          dataIndex:'sex',
                          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",
                          50,
                          trueText:'是',
                          falseText:'不是'
                      },{
                          text:'birthday',
                          dataIndex:'birthday',
                          xtype : "datecolumn",
                          150,
                          format:'Y年m月d日'
                      },{
                          text:'deposit',
                          dataIndex:'deposit',
                          xtype:'numbercolumn',
                          150,
                          format:'0,000'
                      },{
                          text:'描述',xtype:'templatecolumn',
                          tpl:'姓名是{name} 年龄是{age}',
                          150
                      },{
                       text:'Action',xtype:'actioncolumn',
                       id:'delete',
                       icon:'app/view/image/table_delete.png',
                       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);
          }
      });
      

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
        })
        
  • 表格拖拽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’,100,locked:true},
    • 复杂表头
      {
          text:'other',columns:[
              {text:"age",dataIndex:'age',100,locked   : true},
              {text:"int",dataIndex:'index',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',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',100,locked:true},
                      {text:"Name",dataIndex:'name',100},
                      //{text:'others',columns:[
                          {text:"age",dataIndex:'age',100,filterable: true,filter: {type: 'numeric'}},
                          {text:"email",dataIndex:'email',250,
                              field:{
                                  xtype:'textfield',
                                  allowBlank:false
                              }
                          },{
                              text:'index',dataIndex:'index',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',
           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'
                  }
           ]
      })
      

tree组件

  • 类结构
    • Ext.panel.Panel
      • Ext.panel.Table
        • Ext.tree.Panel
          • 和grid完全一样
  • 快速实现一个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       
      //          }]
      //      }]
      //  }
      });
      
  • 树形的拖拽
    • Ext.tree.ViewDDPlugin
      • alias: ‘plugin.treeviewdragdrop’,
        viewConfig:{
            plugins :{
                ptype:'treeviewdragdrop'
            }
        },
        
    • 事件
      listeners: {
          drop: function(node, data, dropRec, dropPosition) {},
          beforedrop:function(node,data,overModel,dropPosition,dropFunction,options ){ }
      }  
      
    • 模拟拷贝和黏贴
    • 删除操作
    • 多列树
    • 单击树形根节点子节点也被选中
    • 代码
    • 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: {
                           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',
          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',100,
                  field:{
                      xtype:'textfield',
                      allowBlank:false
                  }
              },
              {text:'部门经理',dataIndex:'manager',100,
                  field:{
                      xtype:'textfield',
                      allowBlank:false
                  }       
              },
              {text:'顺序排序',dataIndex:'orderIndex',100},
              {text:'只能简介',dataIndex:'info',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',
               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;
      }
      

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.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.Checkbox 选择框方式的
        • Ext.form.field.Radio 单选框
      • Ext.form.field.Hidden 特殊的-隐藏字段
    • Ext.form.field.HtmlEditor 特殊的-文本编辑框
  • 其中夹杂布局的类
    • Ext.form.FieldContainer
      • Ext.form.CheckboxGroup
        • Ext.form.RadioGroup
    • Ext.form.Label
      • Ext.form.Labelable
    • Ext.form.FieldSet
    • 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.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',
                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:'爱好',
                    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.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,
            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,
            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,
            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,
            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,
            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,
            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,
            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,
            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,
            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,
            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,
            600,
            frame:true,
            items:[{
                xtype:'htmleditor',
                name:'HTML',
                height:320,
                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,
            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,
            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',
                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.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]
    • Ext.tab.Panel
      • 选项卡布局
      • 特殊(他不在布局的包下面)
  • panel.js
    Ext.onReady(function(){
        Ext.QuickTips.init();
        Ext.create('Ext.panel.Panel',{
            title: '[01]面板的头部[Ext.panel.Header]',
             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',
                            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', {
             800,
            height: 280,
            title: "AutoLayout布局的面板",
            layout: 'auto',//设置布局
            renderTo: 'demo',
            items: [{
                xtype: 'panel',
                title: '第一个面板',
                 '75%', //站总体宽度的75%
                height: 90
            },{
                xtype: 'panel',
                title: '第二个面板',
                 '75%',
                height: 90
            },{
                xtype: 'panel',
                title: '第三个面板',
                 '99%',
                height: 90
            }]
        });
    })
    
  • fit.js
    Ext.onReady(function(){
        Ext.QuickTips.init();
        Ext.create('Ext.Panel', {
             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布局',
             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', {
             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', {
             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', {
             200,
            height: 200,
            title: "absolute布局的面板",
            layout: 'absolute',//设置布局
            renderTo: 'demo',
            items:[{
                title: '子面板',
                x: 50,
                y: 50,
                 100,
                height: 100,
                html: '定位在 x:50, y:40'
            }]
        });
    })
    
  • column.js
    Ext.onReady(function(){
        Ext.QuickTips.init();
        Ext.create('Ext.Panel', {
             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',
                 250,
                html: 'Content'
            }]
        });
    })
    
  • Table.js
    Ext.onReady(function(){
        Ext.QuickTips.init();
        Ext.create('Ext.Panel', {
             400,
            height: 230,
            title: "table布局的面板",
            layout: {
                type:'table',
                columns:4//四列
            },//设置布局
            defaults:{
                 100,
                height: 100,
                frame:true
            },
            renderTo: 'demo',
            items: [{
                title: "1",
                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', {//一般是这样配合使用的
            // 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',
                 175,
                minSize: 100,
                maxSize: 250
            },{
                title: '中间Content',
                collapsible: false,
                region:'center',
                margins: '5 0 0 0'
            },{
                title: '右面east',
                 175,
                region:'east',
                margins: '5 0 5 5'
            }]
        });
    })
    
  • Box.js
    Ext.onReady(function(){
        Ext.QuickTips.init();
        Ext.create('Ext.Panel', {
             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', {
             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
  • 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",{
        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,
                   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', {
             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,
                       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', {
             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', {
             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,
                       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', {
             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', {
             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', {
             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,
                       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', {
             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', {
             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', {
             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', {
             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()
        })
    });

原文地址:https://www.cnblogs.com/happyzwt/p/8306902.html