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',width:100},
      {text:"age",dataIndex:'age',width:100},
      {text:"email",dataIndex:'email',width:350,
      field:{ //指定可编辑字段
      xtype:'textfield', //指定可编辑类型
      allowBlank:false
      }
      }
      ],
      tbar :[
      {xtype:'button',text:'添加',iconCls:'table_add'},
      {xtype:'button',text:'删除',iconCls:'table_remove',
      handler:function(o){
      //var gird = o.findParentByType("gridpanel"); //获取父级
      var gird = o.ownerCt.ownerCt; //获取删除按钮的父级的父级
      // 获取选中数据集
      var data = gird.getSelectionModel().getSelection();
      if(data.length == 0){
      Ext.Msg.alert("提示","请选择数据");
      }else{
      //// 根据name得到数据
      var st = gird.getStore(); //获取数据集
      var ids = []; //存储被选中数据的name集合
      Ext.Array.each(data,function(record){
      ids.push(record.get('name'));
      })
      //// 后台操作(delete)、前端操作DOM进行删除(ExtJs)
      Ext.Ajax.request({
      url:'/extjs/extjs!deleteData.action',
      params:{ids:ids.join(",")}, //指定要删除数据的name集合
      method:'POST',
      timeout:2000, //设定响应等待时间
      success:function(response,opts){
      Ext.Array.each(data,function(record){
      st.remove(record); //从store中删除该条记录
      })
      }
      })
      }
      }
      },
      {xtype:'button',text:'修改',iconCls:'table_edit'},
      {xtype:'button',text:'查看',iconCls:'table_comm'}
      ],
      dockedItems :[{ //可定位的停靠工具条
      xtype:'pagingtoolbar', //分页工具条
      store:Ext.data.StoreManager.lookup('s_user'), //指定store
      dock:'bottom',
      displayInfo:true //是否展示信息(eg:条数)
      }],
      plugins:[ //配置可编辑单元格插件实现grid的编辑
      Ext.create("Ext.grid.plugin.CellEditing",{
      clicksToEdit : 1 //点击N次进入编辑
      })
      ],
      selType:'checkboxmodel', //设定选择模式
      multiSelect:true, //允许多选
      renderTo :Ext.getBody(),
      // 通过指定store的id在StoreManager获取store
      store : Ext.data.StoreManager.lookup('s_user')
      });
    • model.js文件代码
      //// Model类
      Ext.define("user",{
      extend:"Ext.data.Model",
      fields:[
      {name:'name',type:'string',sortable:true},
      {name:'age',type:'int',sortable:true},
      {name:'email',type:'string',sortable:true}
      ]
      });
      //// store类
      Ext.create("Ext.data.Store",{
      model:'user',
      storeId:'s_user', //指定了storeId后store由StoreManager自动管理
      proxy:{
      type:'ajax',
      url:'/extjs/extjs!getUserList.action',
      reader:{
      type:'json',
      root:'root'
      },
      writer:{
      type:'json'
      }
      },
      autoLoad:true //自动加载数据
      });

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',width:100},
      {text:"age",dataIndex:'age',width:100},
      {text:"email",dataIndex:'email',width:350,
      field:{
      xtype:'textfield',
      allowBlank:false
      }
      }
      ],
      tbar :[
      {xtype:'button',text:'添加',iconCls:'table_add'},
      {xtype:'button',id:'delete',text:'删除',iconCls:'table_remove'},
      {xtype:'button',text:'修改',iconCls:'table_edit'},
      {xtype:'button',text:'查看',iconCls:'table_comm'}
      ],
      dockedItems :[{
      xtype:'pagingtoolbar',
      store:'Users',
      dock:'bottom',
      displayInfo:true
      }],
      plugins:[
      Ext.create("Ext.grid.plugin.CellEditing",{
      clicksToEdit : 2 //单击时会报错(ext.js的bug)
      })
      ],
      selType:'checkboxmodel', //设定选择模式
      multiSelect:true,
      store : 'Users',
      initComponent:function(){ //初始化组件,进行渲染
      this.callParent(arguments);
      }
      });
    • store/Users.js文件代码
      Ext.define('AM.store.Users', {
      extend: 'Ext.data.Store',
      model: 'AM.model.User', //define时的名
      storeId: 's_user',
      proxy:{
      type:'ajax',
      url:'/extjs/extjs!getUserList.action',
      reader: {
      type: 'json',
      root: 'root'
      },
      writer:{
      type:'json'
      }
      },
      autoLoad: true //自动加载数据(很关键)
      });
    • model/User.js文件代码
      Ext.define('AM.model.User', {
      extend: 'Ext.data.Model',
      fields: [
      {name: 'name', type: 'string',sortable : true},
      {name: 'age', type: 'int',sortable : true},
      {name: 'email', type: 'string',sortable : true}
      ]
      });

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',width:100},
    {text:"age",dataIndex:'age',width:100},
    {text:"email",dataIndex:'email',width:200,
    field:{
    xtype:'textfield',
    allowBlank:false
    }
    },{
    text:'sex',
    dataIndex:'sex',
    width:50,
    DDName:'sy_sex',
    renderer:function(value){
    if(value){
    if(value == "女"){
    return "<font color='green'>"+value+"</font>"
    }else if(value == "男"){
    return "<font color='red'>"+value+"</font>"
    }
    }
    }
    },{
    text:'isIt',
    dataIndex:'isIt',
    xtype : "booleancolumn",
    width:50,
    trueText:'是',
    falseText:'不是'
    },{
    text:'birthday',
    dataIndex:'birthday',
    xtype : "datecolumn",
    width:150,
    format:'Y年m月d日'
    },{
    text:'deposit',
    dataIndex:'deposit',
    xtype:'numbercolumn',
    width:150,
    format:'0,000'
    },{
    text:'描述',
    xtype:'templatecolumn',
    tpl:'姓名是{name} 年龄是{age}',
    width:150
    },{
    text:'Action',
    xtype:'actioncolumn',
    id:'delete',
    icon:'app/view/image/table_delete.png',
    width:50
    }
    ],
    tbar :[
    {xtype:'button',text:'添加',iconCls:'table_add'},
    {xtype:'button',id:'delete',text:'删除',iconCls:'table_remove'},
    {xtype:'button',text:'修改',iconCls:'table_edit'},
    {xtype:'button',text:'查看',iconCls:'table_comm'}
    ],
    dockedItems :[{
    xtype:'pagingtoolbar',
    store:'Users',
    dock:'bottom',
    displayInfo:true
    }],
    plugins:[
    Ext.create("Ext.grid.plugin.CellEditing",{
    clicksToEdit : 2 //单击时会报错(ext.js的bug)
    })
    ],
    selType:'checkboxmodel', //设定选择模式
    multiSelect:true,
    store : 'Users',
    initComponent:function(){ //初始化组件,进行渲染
    this.callParent(arguments);
    }
    });
  • model/User.js文件代码
    Ext.define('AM.model.User', {
    extend: 'Ext.data.Model',
    fields: [
    {name: 'name', type: 'string',sortable : true},
    {name: 'age', type: 'int',sortable : true},
    {name: 'email', type: 'string',sortable : true},
    {name: 'birthday', type: 'string',sortable : true},
    {name: 'deposit', type: 'int',sortable : true},
    {name: 'isIt', type: 'string',sortable : true},
    {name: 'sex', type: 'string',sortable : true}
    ]
    });

grid选择模式

  • 根类
    • Ext.selection.Model
  • 重要方法
    • 撤销选择 deselect( Ext.data.Model/Index records, Boolean suppressEvent ) : void
    • 得到选择的数据getSelection( ) : Array
    • 得到最后被选择的数据getLastSelected( ) : void
    • 判断指定的数据是否被选择上isSelected( Record/Number record ) : Boolean
    • 选择指定的行selectRange( Ext.data.Model/Number startRow, Ext.data.Model/Number endRow, [Boolean keepExisting], Object dir ) : void
    • keepExisting true保持已选则的,false重新选择
  • 隐藏了一个单元格的选择模式
    • selType: ‘cellmodel’
      • 从这发现的Ext.grid.plugin.CellEditing
    • 重要方法
      • 得到被选择的单元格getCurrentPosition() Object
      • Ext.JSON.encode()
      • itemclick( Ext.view.View this, Ext.data.Model record, HTMLElement item, Number index, Ext.EventObject e, Object options )
      • selectByPosition({“row”:5,”column”:6})
        • 很实用,选择要特殊处理的数据
  • 多选框选择器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',width:100},
      {text:"age",dataIndex:'age',width:100,
      summaryType:'average',
      summaryRenderer: function(value, summaryData, dataIndex) {
      return Ext.util.Format.number(value,"00.0")
      }
      },
      {text:"email",dataIndex:'email',width:200,
      field:{
      xtype:'textfield',
      allowBlank:false
      }
      },{
      text:'sex',
      dataIndex:'sex',
      width:50,
      DDName:'sy_sex',
      renderer:function(value){
      if(value){
      if(value == "女"){
      return "<font color='green'>"+value+"</font>"
      }else if(value == "男"){
      return "<font color='red'>"+value+"</font>"
      }
      }
      }
      },{
      text:'isIt',
      dataIndex:'isIt',
      xtype : "booleancolumn",
      width:50,
      trueText:'是',
      falseText:'不是'
      },{
      text:'birthday',
      dataIndex:'birthday',
      xtype : "datecolumn",
      width:150,
      format:'Y年m月d日'
      },{
      text:'deposit',
      dataIndex:'deposit',
      xtype:'numbercolumn',
      width:150,
      format:'0,000'
      },{
      text:'描述',xtype:'templatecolumn',
      tpl:'姓名是{name} 年龄是{age}',
      width:150
      },{
      text:'Action',xtype:'actioncolumn',
      id:'delete',
      icon:'app/view/image/table_delete.png',
      width:50//,
      // items :[
      // {},{}
      // ]
      // handler:function(grid,row,col){
      // alert(row+" "+col);
      // }
      }
      ],
      tbar :[
      {xtype:'button',text:'添加',iconCls:'table_add'},
      {xtype:'button',id:'del',text:'删除',iconCls:'table_remove'},
      {xtype:'button',text:'修改',iconCls:'table_edit'},
      {xtype:'button',text:'查看',iconCls:'table_comm'},
      {xtype:'button',id:'selection',text:'selection',iconCls:'table_comm'}
      ],
      dockedItems :[{
      xtype:'pagingtoolbar',
      store:'Users',
      dock:'bottom',
      displayInfo:true
      }],
      plugins:[
      Ext.create("Ext.grid.plugin.CellEditing",{
      clicksToEdit : 2
      })
      ],
      //selType:'rowmodel',//设定选择模式
      selType:'cellmodel',
      //multiSelect:true,//运行多选
      //enableKeyNav :true,
      store : 'Users',
      initComponent:function(){
      this.callParent(arguments);
      }
      });

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’,width:100,locked:true},
    • 复杂表头
      {
      text:'other',columns:[
      {text:"age",dataIndex:'age',width:100,locked : true},
      {text:"int",dataIndex:'index',width:100}]
      }
    • 字段过滤
      Ext.require([
      'Ext.ux.grid.FiltersFeature'
      ]);
      //创建类
      Ext.define("AM.class.filters",{
      alias: 'widget.filters',
      ftype: 'filters',
      encode: false,
      local: true,
      filters: [{
      type: 'boolean',
      dataIndex: 'visible'
      }
      ]
      })
      //view层中添加
      features: [Ext.create("AM.class.filters")],
      列中{filterable: true,text:"age",dataIndex:'age',width:100,filter: {type: 'numeric'}},
  • 代码
    • app.js
      Ext.onReady(function(){
      Ext.QuickTips.init();
      Ext.Loader.setConfig({
      enabled:true
      });
      Ext.Loader.setPath('Ext.ux', '../../../extjs4/examples/ux');
      Ext.require([
      'Ext.ux.data.PagingMemoryProxy',
      'Ext.ux.SlidingPager',
      'Ext.ux.grid.FiltersFeature'
      ]);
      Ext.application({
      name : 'AM',
      appFolder : "app",
      launch:function(){
      Ext.create('Ext.container.Viewport', {
      layout:'auto',
      items:[{
      xtype: 'userlist',
      title: 'Users'
      },{
      xtype:'proList'
      }]
      });
      },
      controllers:[
      'Users'
      ]
      });
      })
    • controller/Users.js
      Ext.define('AM.controller.Users', {
      extend: 'Ext.app.Controller',
      init:function(){
      this.control({
      'userlist':{
      edit:function(editor,e,options){
      //Model
      //e.record.commit(); }
      },
      'userlist button[id=save]':{
      click:function(o){
      var gird = o.ownerCt.ownerCt;
      var st = gird.getStore();
      st.sync();//数据与后台同步
      var records = st.getUpdatedRecords();
      Ext.Array.each(records,function(model){
      model.commit();
      });
      }
      },
      'userlist button[id=delete]':{
      click:function(o){
      var gird = o.ownerCt.ownerCt;
      var data = gird.getSelectionModel().getSelection();
      if(data.length == 0){
      Ext.Msg.alert("提示","您最少要选择一条数据");
      }else{
      //1.先得到ID的数据(name)
      var st = gird.getStore();
      var ids = [];
      Ext.Array.each(data,function(record){
      ids.push(record.get('name'));
      })
      //2.后台操作(delet)
      Ext.Ajax.request({
      url:'/extjs/extjs!deleteData.action',
      params:{ids:ids.join(",")},
      method:'POST',
      timeout:2000,
      success:function(response,opts){
      Ext.Array.each(data,function(record){
      st.remove(record);
      })
      }
      })
      //3.前端操作DOM进行删除(ExtJs)
      }
      }
      }
      });
      },
      views:[
      'proerty',
      'List'
      ],
      stores :[
      "Users"
      ],
      models :[
      "User"
      ]
      });
    • model/User.js
      Ext.define('AM.model.User', {
      extend: 'Ext.data.Model',
      fields: [
      {name: 'name', type: 'string',sortable : true},
      {name: 'age', type: 'int',sortable : true},
      {name: 'email', type: 'string',sortable : true},
      {name: 'index', type: 'int',sortable : true}
      ]
      });
    • store/Users.js
      Ext.define('AM.store.Users', {
      extend: 'Ext.data.Store',
      model: 'AM.model.User',
      storeId: 's_user',
      proxy:{
      type:'ajax',
      url:'/extjs/extjs!getUserList.action',
      reader: {
      type: 'json',
      root: 'topics'
      },writer:{
      type:'json'
      }
      },
      autoLoad: true
      });
    • view/List.js
      Ext.define("AM.view.List",{
      extend:'Ext.grid.Panel',
      title : 'Grid Demo',//标题
      alias: 'widget.userlist',
      frame : true,//面板渲染
      width : 500,
      height: 380,
      columns : [ //列模式
      //{text:"Name",dataIndex:'name',width:100,locked:true},
      {text:"Name",dataIndex:'name',width:100},
      //{text:'others',columns:[
      {text:"age",dataIndex:'age',width:100,filterable: true,filter: {type: 'numeric'}},
      {text:"email",dataIndex:'email',width:250,
      field:{
      xtype:'textfield',
      allowBlank:false
      }
      },{
      text:'index',dataIndex:'index',width:100
      }
      //]}
      ],
      features: [Ext.create("AM.util.filters")],
      tbar :[
      {xtype:'button',text:'添加',iconCls:'table_add'},
      {xtype:'button',id:'delete',text:'删除',iconCls:'table_remove'},
      {xtype:'button',text:'修改',iconCls:'table_edit'},
      {xtype:'button',text:'查看',iconCls:'table_comm'},
      {xtype:'button',text:'save',id:'save',iconCls:'table_comm'}
      ],
      dockedItems :[{
      xtype:'pagingtoolbar',
      store:'Users',
      dock:'bottom',
      displayInfo:true,
      plugins: Ext.create('Ext.ux.SlidingPager', {})
      }],
      //plugins:[
      // Ext.create("Ext.grid.plugin.CellEditing",{
      // clicksToEdit : 2
      // })
      // Ext.create('Ext.grid.plugin.RowEditing', {
      // clicksToEdit: 1
      // })
      //],
      viewConfig:{
      plugins:[
      Ext.create('Ext.grid.plugin.DragDrop', {
      ddGroup:'ddTree', //拖放组的名称
      dragGroup :'userlist', //拖拽组名称
      dropGroup :'userlist', //释放租名称
      enableDrag:true, //是否启用
      enableDrop:true
      })],
      listeners: {
      drop: function(node, data, dropRec, dropPosition) {
      var st = this.getStore();
      for(i=0;i<st.getCount();i++){
      st.getAt(i).set('index',i+1);
      }
      }
      }
      },
      //selType:'checkboxmodel',//设定选择模式
      //multiSelect:true,//运行多选
      store : 'Users',
      initComponent:function(){
      this.callParent(arguments);
      }
      });
    • view/dd.js
      Ext.define("AM.view.dd",{
      extend:'Ext.grid.plugin.DragDrop',
      alias: 'widget.dd',
      ddGroup:'ddTree',
      dragGroup :'userlist',
      dropGroup :'userlist',
      initComponent:function(){
      this.callParent(arguments);
      }
      })
    • view/proerty.js
      Ext.define("AM.view.proerty",{
      extend:'Ext.grid.property.Grid',
      title: 'Properties Grid',
      alias: 'widget.proList',
      width: 300,
      //自定义渲染的函数
      customRenderers :{
      'boy':function(value){
      return value?'是':'否'
      },
      'emial-width':function(value){
      return value;
      }
      },
      source: {
      'boy':false,
      'emial-width':'100'
      }
      })
    • util/filters.js
      Ext.define("AM.util.filters",{
      alias: 'widget.filters',
      ftype: 'filters',
      encode: false,
      local: true,
      filters: [{
      type: 'boolean',
      dataIndex: 'visible'
      }
      ]
      })

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: {
      width: 750,
      height: 530,
      xtype: 'mainlayout'
      }
      });
      },
      controllers:[
      'DeptController'
      ]
      });
      })
    • controller/DeptController.js
      /**
      * ClassName 部门管理控制器
      */
      Ext.define("AM.controller.DeptController",{
      extend:'Ext.app.Controller',
      GridDoActionUtil:Ext.create("AM.util.GridDoActionUtil"),
      init: function(){
      this.gerGridObj = function(buttion){
      return buttion.ownerCt.ownerCt;
      };
      this.getTreeObj = function(buttion){
      return buttion.ownerCt.ownerCt.ownerCt.ownerCt
      .child('#west-tree').child("#dept-tree");
      };
      this.control({
      'depTree':{
      itemclick:function(tree,record,item,e,opti){
      /**
      * 1.得到单击节点的ID
      * 2.发到后台重新查询数据load表盒 where id="A0"
      * 3.oracle 那就用递归查询
      * http://www.uspcat.com/myknowledgebase/oracle/oracl_digui.htm
      */
      //alert(record.get("id"))
      /**
      * 1.得到节点ID和子节点的ID
      * 2.发到后台重新查询数据load表盒 where id in ("A0","A01010");
      */
      record.collapse(function(){
      return true;
      },function(node){
      console.log(node);
      })
      //grid.load({whereSql:'in ('A0')'})
      }
      },
      'deptlist button[id=delete]':{
      click:function(deleteButton){
      var grid = this.gerGridObj(deleteButton);
      var tree = this.getTreeObj(deleteButton);
      this.GridDoActionUtil.doDelete(grid,tree);
      }
      },
      //第二讲中修改
      'deptlist button[id=save]':{
      click:function(saveButton){
      var grid = this.gerGridObj(saveButton);
      var tree = this.getTreeObj(saveButton);
      this.GridDoActionUtil.doSave(grid,tree);
      }
      },
      //设定列表添加按钮的事件
      'deptlist button[id=add]':{
      click:function(addButton){
      //得到数据表格的对象
      var grid = this.gerGridObj(addButton);
      var modelObj = {
      text: '',
      id: 'A01',
      info :'',
      orderIndex:0,
      manager:'',
      nodeType:'ROOT',
      leaf : true
      };
      //得到tree
      var tree = this.getTreeObj(addButton);
      this.GridDoActionUtil.doInsert(grid,modelObj,tree); }
      }
      })
      },
      views:[
      'DeptTree',
      'DeptList',
      'MainLayout'
      ],
      stores:[
      'DeptStore4Tree',
      'DeptStore'
      ],
      models:[
      //'DeptModel'
      ]
      });
    • model/DeptModel.js(停用)
      /**
      * ClassName 部门的实体
      * text : 部门的名称
      * id : id主键
      * info : 信息
      * orderIndex : 排序字段
      * manager : 部门的经理
      * nodeType : 节点类型
      * leaf : 是否叶子
      */
      Ext.define("AM.model.DeptModel",{
      extend:'Ext.data.Model',
      fields:[
      {name:'text',type:'string'},
      {name:'id',type:'string'},
      {name:'info',type:'string'},
      {name:'orderIndex',type:'int'},
      {name:'manager',type:'string'},
      {name:'nodeType',type:'string'},
      {name:'leaf',type:'string'}
      ]
      });
    • store/DeptStore.js
      /**
      * ClassName 部门实体数据集
      */
      Ext.define("AM.store.DeptStore",{
      extend:'Ext.data.Store',
      //model:'AM.model.DeptModel',
      model : modelFactory.getModelByName("AM.model.DeptModel"),
      proxy:{
      api:{
      update:'/extjs/extjs!updateDeptList.action',
      remove:'/extjs/extjs!updateDeptList.action'
      },
      type:'ajax',
      url:'/extjs/extjs!readDeptForGrid.action',
      reader:{
      type:'json',
      root:'topics'
      },
      writer:{
      type:'json'
      }
      },
      autoLoad:true
      });
    • store/DeptStore4Tree.js
      Ext.define("AM.store.DeptStore4Tree",{
      extend:'Ext.data.TreeStore',
      defaultRootId : 'root',
      proxy:{
      type:'ajax',
      url:'/extjs/extjs!readDeptTree.action',
      reader:'json'
      }
      });
    • view/DeptList.js
      /**
      * ClassName 部门管理数据列表视图
      */
      Ext.define("AM.view.DeptList",{
      extend:'Ext.grid.Panel',
      alias:'widget.deptlist',
      store:'DeptStore',
      width:540,
      height:400,
      selModel:{
      selType:'checkboxmodel'
      },
      border:0,
      multiSelect: true,
      frame:true,
      tbar:[
      {xtype:'button',text:'添加',id:'add',iconCls:'table_add'},
      {xtype:'button',text:'删除',id:'delete',iconCls:'table_remove'},
      {xtype:'button',text:'保存',id:'save',iconCls:'table_save'}
      ],
      dockedItems:[{
      xtype:'pagingtoolbar',
      store:'DeptStore',
      dock:'bottom',
      displayInfo:true
      }],
      enableKeyNav:true,
      columnLines: true,
      columns:[
      {text:'部门名称',dataIndex:'text',width:100,
      field:{
      xtype:'textfield',
      allowBlank:false
      }
      },
      {text:'部门经理',dataIndex:'manager',width:100,
      field:{
      xtype:'textfield',
      allowBlank:false
      }
      },
      {text:'顺序排序',dataIndex:'orderIndex',width:100},
      {text:'只能简介',dataIndex:'info',width:100}
      ],
      initComponent:function(){
      this.editing = Ext.create("Ext.grid.plugin.CellEditing");
      this.plugins = [this.editing];
      this.callParent(arguments)
      }
      });
    • view/DeptTree.js
      Ext.define("AM.view.DeptTree",{
      extend:'Ext.tree.Panel',
      alias:'widget.depTree',
      rootVisible:false,//不展示ROOT
      displayField:'text',
      animate:false,
      store:'DeptStore4Tree'
      })
    • view/MainLayout.js
      Ext.define("AM.view.MainLayout",{
      extend:'Ext.panel.Panel',
      alias:'widget.mainlayout',
      defaults:{
      split:true,
      bodyStyle:'padding:1px'
      },
      layout:'border',
      items:[{
      title:'部门树形',
      region:'west',
      iconCls:'dept_tree',
      xtype:'panel',
      margins:'5 2 5 5',
      width: 200,
      collapsible:true,//可以被折叠
      id:'west-tree',
      layout:'fit',
      items:[{
      xtype:'depTree',
      id:'dept-tree'
      }]
      },{
      title:'部门数据表格',
      iconCls:'dept_table',
      region:'center',
      xtype:'panel',
      id:'center-grid',
      margins:'5 5 5 0',
      layout:'fit',
      items:[{
      id:'dept-grid',
      xtype:'deptlist'
      }]
      }]
      });
    • comm/ModelFactory.js
      /**
      * 工厂类
      */
      Ext.define("AM.model.modelFactory",{
      //数据类模型的集合
      models:new Ext.util.MixedCollection(),
      //字段集合
      fields:new Ext.util.MixedCollection(),
      getModelByName:function(modelName){
      //1.声明类,返回类的ClassName
      if(this.models.containsKey(modelName)){
      return modelName;
      }else{
      //ajax拿到我们的字段集合
      var fields = [];
      if(this.fields.containsKey(modelName)){
      fields = this.fields.containsKey(modelName)
      }else{
      Ext.Ajax.request({
      url:'/extjs/extjs!getModelFields.action?modelName='+modelName,
      method:'POST',
      timeout:4000,
      async:false,//跟关键 我不需要异步操作
      success:function(response,opts){
      fields = eval(response.responseText);
      }
      });
      }
      this.fields.add(modelName,fields); var newModel = Ext.define(modelName,{
      extend:'Ext.data.Model',
      fields:fields
      });
      this.models.add(modelName,newModel);
      return modelName;
      }
      }
      });
      var modelFactory = Ext.create('AM.model.modelFactory',{});
    • util/GridDoActionUtilview.js
      Ext.define("AM.util.GridDoActionUtil",{
      doDelete:function(grid,treeObj){
      if(!grid){
      alert("参数传递不正确");
      return;
      }
      //得到数据集合
      var store = grid.getStore();
      var records = grid.getSelectionModel().getSelection();
      var data = [];
      Ext.Array.each(records,function(model){
      data.push(Ext.JSON.encode(model.get('id')));
      });
      if(data.length > 0){
      Ext.Ajax.request({
      url:store.getProxy().api['remove'],
      params:{data:"["+data.join(",")+"]"},
      method:'POST',
      timeout:4000,
      success:function(response,opts){
      Ext.Array.each(records,function(model){
      //tree删除节点
      var node = treeObj.getStore().getNodeById(model.get('id'));
      var parentNode = node.parentNode;
      try{
      node.remove(true);
      if(parentNode){
      if(!parentNode.getChildAt(0)){
      parentNode.data['leaf'] = true;
      parentNode.updateInfo();
      }
      }
      }catch(e){
      console.log(e);
      }
      //表格删除数据
      store.remove(model);
      })
      }
      })
      } },
      /**
      * 列表的批量修改
      * @param {} grid
      * @param {} treeObj
      */
      doSave:function(grid,treeObj){
      if(!grid){
      alert("参数传递不正确");
      return;
      }
      //得到数据集合
      var store = grid.getStore();
      //records 被你修改过的数据
      var records = store.getUpdatedRecords();
      var data = [];
      Ext.Array.each(records,function(model){
      data.push(Ext.JSON.encode(model.data));
      });
      //异步的操作数据
      // store.getProxy().update(new Ext.data.Operation({
      // action:'update'
      // }));
      if(data.length > 0){
      Ext.Ajax.request({
      url:store.getProxy().api['update'],
      params:{data:"["+data.join(",")+"]"},
      method:'POST',
      timeout:4000,
      success:function(response,opts){
      console.log(response.responseText);
      Ext.Array.each(records,function(model){
      var node = treeObj.getStore().getNodeById(model.get('id'));
      node.data['text'] = model.get('text');
      node.updateInfo();
      //取消小箭头
      model.commit();
      });
      }
      });
      }
      },
      /**
      * 树形维护表格的插入操作
      * @param {} grid
      * @param {} modelObj
      * @param {} treeObj
      */
      doInsert:function(grid,modelObj,treeObj){
      if(!(grid && modelObj)){
      alert("参数传递不正确");
      return;
      }
      //得到表格数据集合
      var store = grid.getStore();
      //得到目前表格的数据集合长度
      var storeCount = store.getCount();
      //得到编辑插件
      var edit = grid.editing;
      //得到数据模型
      var model = store.model;
      if(storeCount == 0){//证明添加的节点是ROOT
      //初始化一个模型的类
      var deptObj = new model(modelObj);
      edit.cancelEdit();//取消其他插件的编辑活动
      store.insert(0,deptObj);
      edit.startEditByPosition({
      row:0,
      column:1
      });
      if(treeObj){//我们需要树形操作
      var rootNode = treeObj.getStore().getRootNode();
      rootNode.appendChild({
      id:modelObj["id"],
      text:modelObj["text"],
      leaf:modelObj["leaf"]
      });
      }
      }else{
      //得到被选择的数据集合
      var checkedRecords = grid.getSelectionModel().getSelection();
      if(checkedRecords.length == 1){
      var parentRecord = checkedRecords[0];
      modelObj['nodeType'] = 'GENERAL';
      //第二讲中改********************************
      modelObj['id'] = 'A010101';
      //得到父节点
      var parentNode = treeObj.getStore().getNodeById(parentRecord.get('id'));
      try{
      parentNode.data['leaf'] = false;
      parentNode.updateInfo();
      //给它加一个孩子节点
      parentNode.appendChild({
      id:"A010101",
      text:'',
      leaf:true
      });
      parentNode.expand();
      }catch(e){
      }
      edit.cancelEdit();//取消其他插件的编辑活动
      var deptObj = new model(modelObj);
      store.insert(0,deptObj);
      edit.startEditByPosition({
      row:0,
      column:1
      });
      }else{
      alert("请选择1个父级部门,您现在选择的是["+checkedRecords.length+"]个");
      }
      }
      }
      });
    • resources/css/dept.css
      .dept_table{
      background-image: url(/Learning-extjs4.0/lesson/18/resources/img/dept_table.png) !important;
      }
      .dept_tree{
      background-image: url(/Learning-extjs4.0/lesson/18/resources/img/dept_tree.png) !important;
      }
      .table_remove{
      background-image: url(/Learning-extjs4.0/lesson/18/resources/img/table_remove.gif) !important;
      }
      .table_add{
      background-image: url(/Learning-extjs4.0/lesson/18/resources/img/table_add.png) !important;
      }
      .table_save{
      background-image: url(/Learning-extjs4.0/lesson/18/resources/img/tabel_save.png) !important;
      }

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',
    width:300,
    height:150,
    name:'info',
    fieldLabel:'Info'
    }],
    buttons: [
    {text:'登陆系统',handler:function(b){
    var formObj = Ext.getCmp("my_form");
    var basic = formObj.getForm();
    console.log(basic.getValues());
    }}]
    })
    })
  • number.js
    Ext.onReady(function(){
    
        var textFomr = Ext.create("Ext.form.Panel",{
    title : "form中文本框数字框的实例",
    bodyStyle :'padding:5 5 5 5',
    frame : true,
    height : 250,
    width : 400,
    id:'my_form',
    renderTo:'formDemo',
    defaultType:'numberfield',
    defaults:{
    labelSeparator :": ",
    labelWidth : 80,
    width : 200,
    allowBlank: false,
    msgTarget : 'side',
    labelAlign:'left'
    },
    items:[{
    fieldLabel:'整数微调',
    allowDecimals:false,//叫你不能输入小数
    name:'num1',
    id:'num1'
    },{
    fieldLabel:'整数',
    allowDecimals:false,//叫你不能输入小数
    name:'num2',
    id:'num2',
    hideTrigger : true
    },{
    fieldLabel:'小数',
    name:'num3',
    id:'num3',
    emptyText :'请输入小数',
    hideTrigger : false,
    decimalPrecision:3
    },{
    fieldLabel:'定界小数',
    name:'num3',
    id:'num3',
    minValue:10,
    maxValue:100,
    emptyText :'请输入小数',
    hideTrigger : false,
    decimalPrecision:3
    },{
    fieldLabel:'输入限定',
    name:'num4',
    id:'num4',
    baseChars:'01',
    hideTrigger : true
    },{
    fieldLabel:'限定步长',
    name:'num5',
    id:'num5',
    step:0.8,
    hideTrigger : false,
    value:'20'
    },{
    fieldLabel:'只读字段',
    name:'num6',
    id:'num6',
    step:0.8,
    hideTrigger : false,
    value:'20',
    //readOnly:true
    disabled : true
    }],
    buttons: [
    {text:'登陆系统',handler:function(b){
    var formObj = Ext.getCmp("my_form");
    var basic = formObj.getForm();
    console.log(basic.getValues());
    }}]
    })
    })
  • checkbox.js
    Ext.onReady(function(){
    var textFomr = Ext.create("Ext.form.Panel",{
    title : "form中文本框选框的实例",
    bodyStyle :'padding:5 5 5 5',
    frame : true,
    height : 250,
    width : 400,
    id:'my_form',
    renderTo:'formDemo',
    defaults:{
    labelSeparator :": ",
    labelWidth : 50,
    width : 200,
    allowBlank: false,
    msgTarget : 'side',
    labelAlign:'left'
    },
    items:[{
    xtype:'radiofield',
    boxLabel :'男',
    inputValue:'m',
    fieldLabel:'性别',
    checked:true,
    name:'sex'
    },{
    xtype:'radiofield',
    boxLabel :'女',
    inputValue:'w',
    fieldLabel:'性别',
    name:'sex'
    },{
    xtype:'checkboxfield',
    inputValue:'1',
    name:'hobby',
    boxLabel:'唱歌',
    fieldLabel:'爱好'
    },{
    xtype:'checkboxfield',
    inputValue:'2',
    name:'hobby',
    boxLabel:'看书',
    fieldLabel:'爱好'
    },{
    xtype:'checkboxfield',
    inputValue:'3',
    name:'hobby',
    checked:true,
    boxLabel:'编程',
    fieldLabel:'爱好'
    },{
    xtype:'checkboxfield',
    inputValue:'4',
    name:'hobby',
    boxLabel:'交友',
    fieldLabel:'爱好'
    }],
    dockedItems:[{
    xtype:'toolbar',
    dock:'top',
    items:[{
    text:'选择全部的爱好',
    iconCls:'table_comm',
    handler:function(){
    var formObj = Ext.getCmp("my_form");
    var basic = formObj.getForm();
    var fields = basic.getFields();
    fields.each(function(field){
    if("hobby" == field.getName()){
    field.setValue(true)
    }
    })
    }
    }]
    }],
    buttons: [
    {text:'登陆系统',handler:function(b){
    var formObj = Ext.getCmp("my_form");
    var basic = formObj.getForm();
    console.log(basic.getValues());
    }}]
    })
    })
  • checkboxgroup.js
    Ext.onReady(function(){
    var textFomr = Ext.create("Ext.form.Panel",{
    title : "form中文本框选框的实例",
    bodyStyle :'padding:5 5 5 5',
    frame : true,
    height : 250,
    width : 400,
    id:'my_form',
    renderTo:'formDemo',
    defaults:{
    labelSeparator :": ",
    labelWidth : 50,
    width : 200,
    allowBlank: false,
    msgTarget : 'side',
    labelAlign:'left'
    },
    items:[{
    xtype:'radiogroup',
    fieldLabel:'性别',
    columns:2,
    items:[{
    xtype:'radiofield',
    boxLabel :'男',
    inputValue:'m',
    checked:true,
    name:'sex'
    },{
    xtype:'radiofield',
    boxLabel :'女',
    inputValue:'w',
    name:'sex'
    }]
    },{
    xtype:'checkboxgroup',
    fieldLabel:'爱好',
    width:335,
    columns:4,
    items:[{
    xtype:'checkboxfield',
    inputValue:'1',
    name:'hobby',
    boxLabel:'唱歌'
    },{
    xtype:'checkboxfield',
    inputValue:'2',
    name:'hobby',
    boxLabel:'看书'
    },{
    xtype:'checkboxfield',
    inputValue:'3',
    name:'hobby',
    checked:true,
    boxLabel:'编程'
    },{
    xtype:'checkboxfield',
    inputValue:'4',
    name:'hobby',
    boxLabel:'交友'
    }]
    }],
    dockedItems:[{
    xtype:'toolbar',
    dock:'top',
    items:[{
    text:'选择全部的爱好',
    iconCls:'table_comm',
    handler:function(){
    var formObj = Ext.getCmp("my_form");
    var basic = formObj.getForm();
    var fields = basic.getFields();
    fields.each(function(field){
    if("hobby" == field.getName()){
    field.setValue(true)
    }
    })
    }
    }]
    }],
    buttons: [
    {text:'登陆系统',handler:function(b){
    var formObj = Ext.getCmp("my_form");
    var basic = formObj.getForm();
    console.log(basic.getValues());
    }}]
    })
    })
  • Trigger.js
    Ext.onReady(function(){
    
        var textFomr = Ext.create("Ext.form.Panel",{
    title : "form中文本框触发器的实例",
    bodyStyle :'padding:5 5 5 5',
    frame : true,
    height : 250,
    width : 400,
    id:'my_form',
    renderTo:'formDemo',
    defaults:{
    labelSeparator :": ",
    labelWidth : 50,
    width : 200,
    allowBlank: false,
    msgTarget : 'side',
    labelAlign:'left'
    },
    items:[{
    xtype:'triggerfield',
    fieldLabel:'Name',
    name:'userName',
    id:'userName',
    onTriggerClick:function(e){
    var formObj = Ext.getCmp("my_form");
    var basic = formObj.getForm();
    console.log(basic.getValues());
    }
    }]
    })
    })
    • comboBox组件
      • Ext.form.field.ComboBox
      • Ext.view.BoundList 约束列表
      • 本地下拉框
      • Time
      • Date
  • combobox.js
    Ext.onReady(function(){
    Ext.QuickTips.init();
    //部门类
    Ext.define("department",{
    extend:'Ext.data.Model',
    fields:[
    {name:'name'},
    {name:'id'}
    ]
    });
    var st = Ext.create("Ext.data.Store",{
    model:'department',
    data:[
    {name:'销售部',id:'001'},
    {name:'人事部',id:'002'},
    {name:'研发部',id:'003'},
    {name:'产品部',id:'004'},
    {name:'实施部',id:'0`05'},
    {name:'法务部',id:'006'}
    ]
    });
    Ext.create("Ext.form.Panel",{
    title:'本地combobox实例',
    renderTo:'formDemo',
    bodyPadding:'5 5 5 5',
    height:100,
    width:270,
    frame:true,
    defaults:{
    labelSeparator :": ",
    labelWidth : 70,
    width : 200,
    allowBlank: false,
    msgTarget : 'side',
    labelAlign:'left'
    },
    items:[{
    xtype:'combobox',
    listConfig:{//控制下拉列表的样式
    emptyText:'没有找到匹配的数值',
    maxHeight:200
    },
    fieldLabel:'选择部门',
    name:'post',
    queryMode:'local',//[local|remot]
    store:st,
    valueField:"id",
    displayField :'name',
    forceSelection:true,//不运行使用数据集合中没有的数值
    typeAhead : true,
    value:'001'
    }]
    });
    });
  • date.js
    Ext.onReady(function(){
    Ext.QuickTips.init();
    Ext.create("Ext.form.Panel",{
    title:'本地combobox实例',
    renderTo:'formDemo',
    bodyPadding:'5 5 5 5',
    height:100,
    width:270,
    frame:true,
    defaults:{
    labelSeparator :": ",
    labelWidth : 70,
    width : 200,
    allowBlank: false,
    msgTarget : 'side',
    labelAlign:'left'
    },
    items:[{
    xtype:'datefield',
    fieldLabel:'工作日',
    minValue:'01/01/2011',
    maxValue:'31/12/2011',
    disabledDays :[0,6],
    disabledDates:['11年11月08日'],
    disabledDatesText:'这个日期你不能选择'
    }]
    });
    });
  • synccombobox.js
    Ext.onReady(function(){
    Ext.QuickTips.init();
    //部门类
    Ext.define("department",{
    extend:'Ext.data.Model',
    fields:[
    {name:'name'},
    {name:'id'},
    {name:'c'}
    ]
    });
    var st = Ext.create("Ext.data.Store",{
    model:'department',
    pageSize:4,
    proxy:{
    type:'ajax',
    url:'/extjs/extjs!getComboBox.action'
    }
    });
    Ext.create("Ext.form.Panel",{
    title:'本地combobox实例',
    renderTo:'formDemo',
    bodyPadding:'5 5 5 5',
    height:100,
    width:470,
    frame:true,
    defaults:{
    labelSeparator :": ",
    labelWidth : 70,
    width : 300,
    allowBlank: false,
    msgTarget : 'side',
    labelAlign:'left',
    pageSize:4
    },
    items:[{
    xtype:'combobox',
    listConfig:{//控制下拉列表的样式
    emptyText:'没有找到匹配的数值',
    maxHeight:200,
    getInnerTpl :function(){
    return "<div class='{c}'>{name}.{id}</div>";
    }
    },
    fieldLabel:'城市',
    name:'post',
    queryMode:'remot',//[local|remot]
    store:st,
    valueField:"id",
    minChars:1,
    triggerAction :'all',
    queryDelay : 400,
    queryParam:'whereSql',
    multiSelect:true,//允许多选
    displayField :'name'//,
    //forceSelection:true,//不运行使用数据集合中没有的数值
    //typeAhead : true,
    //value:'001'
    }]
    });
    });
  • time.js
    Ext.onReady(function(){
    Ext.QuickTips.init();
    Ext.create("Ext.form.Panel",{
    title:'本地combobox实例',
    renderTo:'formDemo',
    bodyPadding:'5 5 5 5',
    height:100,
    width:270,
    frame:true,
    defaults:{
    labelSeparator :": ",
    labelWidth : 70,
    width : 200,
    allowBlank: false,
    msgTarget : 'side',
    labelAlign:'left'
    },
    items:[{
    xtype:'timefield',
    fieldLabel:'上班时间',
    minValue:'9:00',
    maxValue:'18:00',
    minText:'时间要大于{0}',
    maxText:'时间要小于{0}',
    format:'G时',
    increment:60,
    invalidText:'时间格式错误',
    pickerMaxHeight :100
    }]
    });
    });
    • Ext.form.field.Hidden
    • Ext.form.field.HtmlEditor
    • Ext.form.field.Display 就是为了展示的字段
    • Ext.form.Label
    • Ext.form.FieldSet
    • Ext.form.FieldContainer
    • Ext.form.field.File
  • FieldContainer.js
    Ext.onReady(function(){
    Ext.QuickTips.init();
    Ext.create("Ext.form.Panel",{
    title:'本地FieldContainer实例',
    renderTo:'formDemo',
    bodyPadding:'5 5 5 5',
    height:100,
    width:570,
    defaults:{
    msgTarget : 'side',
    labelAlign:'left'
    },
    frame:true,
    items: [{
    xtype: 'fieldcontainer',
    fieldLabel: '人员信息',
    combineErrors : true,//是否合并展示错误信息
    combineLabels: true,//合并展示标签的信息,配合其他使用
    labelConnector :',',
    layout: {
    type:'hbox',//横排布局(这个起了关键性在作用)
    align:'middle'//垂直居中
    },
    fieldDefaults:{
    hideLabel:true,//以藏label
    allowBlank:false//不允许是空
    },
    defaultType:'textfield',
    items: [{
    xtype:'label',
    forId:'name',
    text:'姓名'
    },{
    fieldLabel: 'name',//虽然被隐藏但是很有用(展示错误信息)
    name: 'name',
    inputId:'name'
    },{
    xtype:'label',
    forId:'photo',
    text:'电话'
    },{xtype: 'displayfield', value: ' ( '},{
    name: 'photo',
    fieldLabel: 'photo',
    inputId:'photo'
    },{xtype: 'displayfield', value: ' ) '}]
    }],
    buttons: [{
    text: '提交',
    handler: function() {
    //up的源码讲解
    this.up('form').getForm().submit({
    params: {
    info: 'age是隐藏字段'
    }
    });
    }
    }]
    });
    });
  • cosupload.jsp
    <%@ page language="java" contentType="text/html; charset=GBk"
    pageEncoding="GBK"%>
    <%@ page import="java.util.*" %>
    <%@ page import="java.io.*" %>
    <%@ page import="com.hd.util.RandomFileRenamePolicy" %>
    <%@page import="com.oreilly.servlet.*"%>
    <%
    //----------------------------------------
    //----------------------------------------
    String root = request.getSession().getServletContext().getRealPath("/");
    String savePath = root + "file-library\\";
    int maxPostSize = 3 * 5 * 1024 * 1024;
    RandomFileRenamePolicy frp = new RandomFileRenamePolicy();
    MultipartRequest multi = new MultipartRequest(request, savePath, maxPostSize, "utf-8",frp);
    String fieldIds = "";
    //取得所有已上传文件的名字,返回枚举类型。
    Enumeration filesName = multi.getFileNames();
    //遍历返回的枚举类型,COS可以上传多个文件,当表单中有多个文本域标签时,使用while关键字遍历.
    long l = 0L;
    String fileType = null;
    String fileName = null;
    while(filesName.hasMoreElements()){
    //当发现枚举类型中包含文件对象,获取文件对象在枚举中的名字
    String fname = (String)filesName.nextElement();
    //通过名字获取文件,返回java文件对象
    File file = multi.getFile(fname);
    //判断是否获得到文件
    if(file != null){
    //获取文件的真实名字(以便能存储到数据库中)
    fileName = multi.getFilesystemName(fname);
    fileType = fileName.substring(fileName.lastIndexOf(".")+1);
    RandomAccessFile raFile = new RandomAccessFile(new File(savePath+fileType+"\\"+fileName),"r");
    l = raFile.length();
    fieldIds = fieldIds + fileName+",";
    }
    }
    fieldIds = fieldIds.substring(0,fieldIds.length()-1);
    response.setContentType("text/html;charset=GBK");
    response.getWriter().print("{'address':'"+RandomFileRenamePolicy.fp+"','docName':'"+RandomFileRenamePolicy.fn+"','fileType':'"+fileType+"','docCode':'"+fileName+"','size':'"+l+"','success':true,'message':'上传成功','ids':'"+fieldIds+"'}");
    %>
  • Display.js
    Ext.onReady(function(){
    Ext.QuickTips.init();
    Ext.create("Ext.form.Panel",{
    title:'本地Display实例',
    renderTo:'formDemo',
    bodyPadding:'5 5 5 5',
    height:100,
    width:270,
    frame:true,
    defaults:{
    labelSeparator :": ",
    labelWidth : 70,
    width : 200,
    allowBlank: false,
    msgTarget : 'side',
    labelAlign:'left'
    },
    items:[{
    xtype:'displayfield',
    name:'name',
    value:'uspcat.com',
    fieldLabel:'展示'
    }],
    buttons:[{
    text:'提交',
    handler:function(){
    this.up("form").getForm().submit({
    params:{
    info:'age是隐藏字段'
    }
    });
    }
    }]
    });
    })
  • FieldContainer.js
    Ext.onReady(function(){
    Ext.QuickTips.init();
    Ext.create("Ext.form.Panel",{
    title:'本地FieldContainer实例',
    renderTo:'formDemo',
    bodyPadding:'5 5 5 5',
    height:100,
    width:500,
    frame:true,
    defaults:{
    msgTarget:'side',
    labelAlign:'left'
    },
    items:[{
    xtype:'fieldcontainer',
    layout:{
    type:'hbox',
    align:'middle'
    },
    combineLabels:true,
    combineErrors:true,
    fieldDefaults:{
    hideLabel:true,//默认字段会隐藏lebel
    allowBlank:false
    },
    defaultType:'textfield',
    items:[{
    xtype:'label',
    forId:'name',
    text:'姓名'
    },{
    fieldLabel:'name',
    name:'name',
    inputId:'name'
    },{
    xtype:'label',
    forId:'phone',
    text:'电话'
    },{
    fieldLabel:'phone',
    name:'phone',
    inputId:'phone'
    }]
    }],
    buttons:[{
    text:'提交',
    handler:function(){
    this.up("form").getForm().submit({
    params:{
    info:'age是隐藏字段'
    }
    });
    }
    }]
    });
    })
  • FieldSet.js
    Ext.onReady(function(){
    Ext.QuickTips.init();
    Ext.create("Ext.form.Panel",{
    title:'本地FieldSet实例',
    renderTo:'formDemo',
    bodyPadding:'5 5 5 5',
    height:300,
    width:270,
    frame:true,
    items:[{
    title:'组合',
    xtype:'fieldset',
    collapsible:true,//可以展示伸缩的按钮
    defaultType:'textfield',
    defaults:{
    anchor:'95%'
    },
    layout:'anchor',
    items:[{
    fieldLabel:'Name',
    name:'name'
    },{
    fieldLabel:'Email',
    name:'Email'
    }]
    },{
    title:'组合2',
    xtype:'fieldset',
    checkboxToggle:true,//启用复选框
    collapsible:true,//可以展示伸缩的按钮
    defaultType:'textfield',
    collapsed:true,//true默认set是收起的
    defaults:{
    anchor:'95%'
    },
    layout:'anchor',
    items:[{
    fieldLabel:'PASS',
    name:'PASS'
    },{
    fieldLabel:'INFO',
    name:'INFO'
    }]
    }],
    buttons:[{
    text:'提交',
    handler:function(){
    this.up("form").getForm().submit({
    params:{
    info:'age是隐藏字段'
    }
    });
    }
    }]
    });
    })
  • File.js
    Ext.onReady(function(){
    Ext.QuickTips.init();
    Ext.create("Ext.form.Panel",{
    title:'本地File实例',
    renderTo:'formDemo',
    bodyPadding:'5 5 5 5',
    height:100,
    width:270,
    frame:true,
    items:[{
    xtype:'filefield',
    name:'photo',
    fieldLabel:'照片',
    labelWidth:50,
    msgTarget:'side',
    allowBlank:false,
    anchor:'98%',
    buttonText:'请选中文件'
    }],
    buttons:[{
    text:'提交',
    handler:function(){
    this.up("form").getForm().submit({
    url:'/platform/assistJsp/upload/cosupload.jsp',
    waitMsg:'文件上传中',
    success:function(){
    Ext.Msg.alert("success","文件上传成功");
    }
    });
    }
    }]
    });
    })
  • hidden.js
    Ext.onReady(function(){
    Ext.QuickTips.init();
    Ext.create("Ext.form.Panel",{
    title:'本地hiddenfield实例',
    renderTo:'formDemo',
    bodyPadding:'5 5 5 5',
    height:100,
    width:270,
    frame:true,
    defaults:{
    labelSeparator :": ",
    labelWidth : 70,
    width : 200,
    allowBlank: false,
    msgTarget : 'side',
    labelAlign:'left'
    },
    items:[{
    xtype:'textfield',
    name:'name',
    fieldLabel:'name',
    value:'USPCAT.COM'
    },{
    xtype:'hiddenfield',
    name:'age',
    value:'1'
    }],
    buttons:[{
    text:'提交',
    handler:function(){
    this.up("form").getForm().submit({
    params:{
    info:'age是隐藏字段'
    }
    });
    }
    }]
    });
    })
  • HtmlEditor.js
    Ext.onReady(function(){
    Ext.QuickTips.init();
    Ext.create("Ext.form.Panel",{
    title:'本地htmleditor实例',
    renderTo:'formDemo',
    bodyPadding:'5 5 5 5',
    height:400,
    width:600,
    frame:true,
    items:[{
    xtype:'htmleditor',
    name:'HTML',
    height:320,
    width:580,
    fontFamilies :['宋体','黑体','楷体'],
    defaultLinkValue :'http://www.uspcat.com'
    }],
    buttons:[{
    text:'提交',
    handler:function(){
    this.up("form").getForm().submit({
    params:{
    info:'age是隐藏字段'
    }
    });
    }
    }]
    });
    })
  • Label.js
    Ext.onReady(function(){
    Ext.QuickTips.init();
    Ext.create("Ext.form.Panel",{
    title:'本地Label实例',
    renderTo:'formDemo',
    bodyPadding:'5 5 5 5',
    height:100,
    width:270,
    frame:true,
    items:[{
    xtype:'label',
    name:'name',
    text:'展示',
    forId :'myname',
    overCls:'a'
    },{
    xtype:'textfield',
    name:'age',
    value:'1',
    inputId:'myname',
    hideLabel:true
    }]
    });
    })
    • 从Grid中装载数据 basic.loadRecord(Model);
    • 服务器装载数据
      • 异步装载
    • 表单的提交操作
      • Ajax提交数据
      • 传统方式提交
  • load.js
    Ext.onReady(function(){
    Ext.QuickTips.init();
    Ext.create("Ext.form.Panel",{
    title:'本地load实例',
    renderTo:'formDemo',
    bodyPadding:'5 5 5 5',
    height:300,
    width:400,
    frame:true,
    defaults:{
    labelSeparator :": ",
    labelWidth : 70,
    width : 300,
    allowBlank: false,
    msgTarget : 'side',
    labelAlign:'left'
    },
    items:[{
    fieldLabel:'ID',
    xtype:'textfield',
    name:'userId',
    value:'001'//硬编码写值
    },{
    fieldLabel:'NAME',
    xtype:'textfield',
    name:'userName',
    value:'uspcat.com'//硬编码写值
    },{
    fieldLabel:'AGE',
    xtype:'numberfield',
    name:'userAge',
    value:'1'//硬编码写值
    },{
    xtype:'textareafield',
    width:300,
    height:150,
    name:'info',
    fieldLabel:'INFO'
    }],
    buttons:[{
    text:'提交数据',
    handler:function(){
    //得到form
    var basic = this.up("form").getForm();
    basic.submit({
    clientValidation: true,//要经过客户端验证的
    url: '/extjs/extjs!getFormValues.action',
    method:'POST',
    success:function(){
    Ext.Msg.alert('提示',"提交数据");
    }
    });
    }
    },{
    text:'加载远程数据',
    handler:function(){
    //得到form
    var basic = this.up("form").getForm();
    //得到userId
    var userId = basic.findField("userId").getValue();
    basic.load({
    params:{userId:userId},
    url:'/extjs/extjs!getFormValues.action',
    method:'POST',
    success:function(form,action){
    Ext.Msg.alert('提示',"加载成功");
    },
    failure:function(form,action){
    Ext.Msg.alert('提示',"失败原因是: "+action.result.errorMessage);
    }
    }); }
    }]
    });
    });

panel与layout

  • 面板
    • 类结构
      • Ext.Base
        • Ext.AbstractComponent
          • Ext.Component
            • Ext.container.AbstractContainer
              • Ext.container.Container
                • Ext.panel.AbstractPanel
                  • Ext.panel.Panel (是以前版本的Ext.Panel类)
    • 常见的子类
      • Ext.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]',
    width: 500,
    bodyPadding : 10,//边距
    height: 400,
    hideCollapseTool:false,
    collapsible :true,
    //animCollapse : false,//控制动画
    //frame : true,//渲染面板
    autoLoad:'/Learning-extjs4.0/lesson/26/ass.html',//只要是不是null自动加载内容
    html: '<p>[02]面板体</p>',//和上面的属性是冲突的
    autoScroll:true,//自动滚动条
    closable:true,//运行客户关闭
    closeAction:'destroy',//设置关闭动作[destroy|hide]
    bodyStyle: {
    background: '#ffc'
    },
    renderTo: 'demo',
    tbar: [
    { xtype: 'button', text: '[03]顶部工具栏' }
    ],
    bbar: [
    { xtype: 'button', text: '[04]底部工具栏 ' }
    ],
    dockedItems: [{
    xtype: 'toolbar',
    dock: 'bottom',
    ui: 'footer',
    items: [
    { xtype: 'component', flex: 1 },
    { xtype: 'button', text: '[05]面板底部',
    handler:function(b){
    b.up("panel").removeAll(true)//自动销毁
    }
    }
    ]
    }],
    tools:[{
    type:'refresh',
    qtip: '刷新'
    },{
    type:'help',
    qtip: '帮助'
    },{
    id:'next',
    handler: function(event, toolEl, panel){
    panel.up("panel").insert(0,{
    xtype:'panel',
    width:100,
    height:100,
    bodyStyle: {
    background: 'red'
    }
    })
    }
    }]
    });
    });
    /**
    close、collapse、down、expand、gear、help、left、maximize、minimize
    minus、move、next、pin、plus、prev、print、refresh、resize、restore
    right、save、search、toggle、unpin、up
    */
  • auto.js
    Ext.onReady(function(){
    Ext.QuickTips.init();
    Ext.create('Ext.Panel', {
    width: 800,
    height: 280,
    title: "AutoLayout布局的面板",
    layout: 'auto',//设置布局
    renderTo: 'demo',
    items: [{
    xtype: 'panel',
    title: '第一个面板',
    width: '75%', //站总体宽度的75%
    height: 90
    },{
    xtype: 'panel',
    title: '第二个面板',
    width: '75%',
    height: 90
    },{
    xtype: 'panel',
    title: '第三个面板',
    width: '99%',
    height: 90
    }]
    });
    })
  • fit.js
    Ext.onReady(function(){
    Ext.QuickTips.init();
    Ext.create('Ext.Panel', {
    width: 500,
    height: 280,
    title: "AutoLayout布局的面板",
    layout: 'fit',//设置布局
    renderTo: 'demo',
    items: [{
    xtype: 'panel',
    title: '第一个面板'
    },{
    xtype: 'panel',
    title: '第二个面板'
    }]
    });
    })
  • Accordion.js
    Ext.onReady(function(){
    Ext.QuickTips.init();
    Ext.create('Ext.panel.Panel', {
    title: 'Accordion布局',
    width: 300,
    height: 300,
    layout:'accordion',
    defaults: {
    bodyStyle: 'padding:15px'
    },
    layoutConfig: {
    titleCollapse: false,
    animate: true,
    activeOnTop: true
    },
    items: [{
    title: 'Panel 1',
    html: '面板1'
    },{
    title: 'Panel 2',
    html: '面板2'
    },{
    title: 'Panel 3',
    html: '面板3'
    }],
    renderTo: 'demo'
    });
    });
  • card.js
    Ext.onReady(function(){
    Ext.QuickTips.init();
    var navigate = function(panel, direction,btn){
    var layout = panel.getLayout();
    layout[direction]();
    //next(),prev()
    //card的关键函数next( ) : Ext.Component,prev( ) : Ext.Component
    //getNext( ) : Ext.Component,getPrev( ) : Ext.Component
    Ext.getCmp('move-prev').setDisabled(!layout.getPrev());
    Ext.getCmp('move-next').setDisabled(!layout.getNext());
    };
    Ext.create('Ext.Panel', {
    width: 500,
    height: 280,
    layout: 'card',//设置布局
    activeItem:0,//默认展示的子节点索引
    renderTo: 'demo',
    items: [{
    id: 'card-0',
    xtype: 'panel',
    title: '第一个面板',
    html:'第一个面板'
    },{
    id: 'card-1',
    xtype: 'panel',
    title: '第二个面板',
    html:'第二个面板'
    },{
    id: 'card-3',
    xtype: 'panel',
    title: '第三个面板',
    html:'第三个面板'
    }],
    index:1,//自定义索引
    titleInfo: "cardt布局的面板",
    listeners: {
    render:function(){
    var panel = this;
    panel.setTitle(panel.titleInfo+"("+(this.activeItem+1)+"/"+panel.items.length+")");
    }
    },
    bbar: [{
    id: 'move-prev',
    text: '上一页',
    handler: function(btn) {
    var panel = btn.up("panel");
    panel.index = panel.index-1;
    panel.setTitle(panel.titleInfo+"("+panel.index+"/"+panel.items.length+")");
    navigate(panel, "prev");
    },
    disabled: true
    },
    '->',
    {
    id: 'move-next',
    text: '下一页',
    handler: function(btn) {
    var panel = btn.up("panel");
    panel.index = panel.index+1;
    panel.setTitle(panel.titleInfo+"("+panel.index+"/"+panel.items.length+")");
    navigate(panel, "next");
    }
    }
    ]
    });
    })
  • anchor.js
    Ext.onReady(function(){
    Ext.QuickTips.init();
    Ext.create('Ext.Panel', {
    width: 500,
    height: 500,
    title: "Anchor布局的面板",
    layout: 'anchor',//设置布局
    renderTo: 'demo',
    items: [{
    xtype: 'panel',
    title: '75% 宽 and 20% 高',
    anchor: '75% 20%'
    },{
    xtype: 'panel',
    title: '偏移量 -300 宽 & -200 高',
    anchor: '-300 -200'
    },{
    xtype: 'panel',
    title: '综合使用 -250 宽 20% 高',
    anchor: '-250 20%'
    }]
    });
    })
  • Absolute.js
    Ext.onReady(function(){
    Ext.QuickTips.init();
    Ext.create('Ext.Panel', {
    width: 200,
    height: 200,
    title: "absolute布局的面板",
    layout: 'absolute',//设置布局
    renderTo: 'demo',
    items:[{
    title: '子面板',
    x: 50,
    y: 50,
    width: 100,
    height: 100,
    html: '定位在 x:50, y:40'
    }]
    });
    })
  • column.js
    Ext.onReady(function(){
    Ext.QuickTips.init();
    Ext.create('Ext.Panel', {
    width: 1000,
    height: 200,
    title: "column布局的面板",
    layout: 'column',//设置布局
    renderTo: 'demo',
    items: [{
    title: '宽 = (总宽度-250)*25%',
    columnWidth: .25,//这个布局特有的写法
    html: 'Content'
    },{
    title: '宽 = (总宽度-250)*75%',
    columnWidth: .75,
    html: 'Content'
    },{
    title: '宽 = 250px',
    width: 250,
    html: 'Content'
    }]
    });
    })
  • Table.js
    Ext.onReady(function(){
    Ext.QuickTips.init();
    Ext.create('Ext.Panel', {
    width: 400,
    height: 230,
    title: "table布局的面板",
    layout: {
    type:'table',
    columns:4//四列
    },//设置布局
    defaults:{
    width: 100,
    height: 100,
    frame:true
    },
    renderTo: 'demo',
    items: [{
    title: "1",
    width:300,//这个布局特有的写法
    colspan: 3//跨三列
    },{
    title: '2',
    height:200,
    rowspan:2//跨两行
    },{
    title: '3'
    },{
    title: '4'
    },{
    title: '5'
    }]
    });
    })
  • Border.js
    Ext.onReady(function(){
    Ext.QuickTips.init();
    Ext.create('Ext.container.Viewport', {//一般是这样配合使用的
    //width: 1000,
    //height: 800,
    //renderTo: Ext.getBody(),
    title: "table布局的面板",
    layout:'border',
    defaults: {
    collapsible: true,
    split: true,
    bodyStyle: 'padding:15px'
    },
    items: [{
    title: '上面north',
    region: 'north',
    height: 100,
    cmargins: '5 0 0 0'
    },{
    title: '下面south',
    region: 'south',
    height: 150,
    minSize: 75,
    maxSize: 250,
    cmargins: '5 0 0 0'
    },{
    title: '左面west',
    region:'west',
    margins: '5 0 0 0',
    cmargins: '5 5 0 0',
    width: 175,
    minSize: 100,
    maxSize: 250
    },{
    title: '中间Content',
    collapsible: false,
    region:'center',
    margins: '5 0 0 0'
    },{
    title: '右面east',
    width: 175,
    region:'east',
    margins: '5 0 5 5'
    }]
    });
    })
  • Box.js
    Ext.onReady(function(){
    Ext.QuickTips.init();
    Ext.create('Ext.Panel', {
    width: 400,
    height: 230,
    renderTo: Ext.getBody(),
    title: "Vbox布局的面板",
    layout: {
    type: 'vbox',
    align : 'stretch',
    pack : 'start'
    },
    items: [
    {html:'panel 1', flex:1},
    {html:'panel 2', height:150},
    {html:'panel 3', flex:2}
    ]
    });
    })
  • tab.js
    Ext.onReady(function(){
    Ext.QuickTips.init();
    Ext.create('Ext.tab.Panel', {
    width: 400,
    height: 230,
    renderTo: Ext.getBody(),
    items: [{
    title: '第一个选项卡'
    }, {
    title: '第二个选项卡'
    }],
    buttons:[{
    text:'增加选项卡',
    handler:function(btn){
    var panel = btn.up("tabpanel");
    var index = panel.items.length+1;
    var tabPage = panel.add({
    title: '第'+index+'个选项卡',
    html:'我新添加的tab',
    closable:true
    });
    panel.setActiveTab(tabPage);//启用激活他
    }
    }]
    });
    })

chart

  • 图表分为坐标轴(axes)和图表序列(series)
    • axes 轴
      • 数值轴 Ext.chart.axis.Numeric
      • 时间轴 Ext.chart.axis.Time
      • 分类轴 Ext.chart.axis.Category
      • 仪表轴 Ext.chart.axis.Gauge
    • series 图表序列
      highlight高亮,label标题,tips提示,renderer格式化
      • 折线图 Ext.chart.series.Line
      • 柱形图 Ext.chart.series.Column
      • 饼状图 Ext.chart.series.Pie
      • 条形图 Ext.chart.series.Bar
      • 面积图 Ext.chart.series.Area
      • 雷达图 Ext.chart.series.Radar 略
      • 散点图 Ext.chart.series.Scatter 略
      • 仪表图 Ext.chart.series.Gauge
  • Numeric.js
    var dataStore = Ext.create("Ext.data.Store",{
    fields:[
    'name','data'
    ],
    data:[
    {name:'0~10岁',data:120},
    {name:'11~18岁',data:170},
    {name:'19~24岁',data:175}
    ]
    });
    var b1 = Ext.create("Ext.Window",{
    width:600,
    height:500,
    title:'年龄身高分布图',
    shadow:false,
    maximizable:true,
    layout:'fit',
    items:[{
    xtype:'chart',
    style:'background:#fff',//控制背景颜色
    animate :true,//运行动画
    shadow : true,
    theme:"Category1",//皮肤
    store:dataStore,
    axes:[{
    type:'Numeric',
    position:'left',//放置到左边
    dashSize:5,//引导线的宽度设置
    title:'身高分布(CM)',
    fields:['data'],//显示的数据索引
    majorTickSteps:5,
    minorTickSteps:6,
    grid:{
    odd:{//奇数行
    opacity:1,//不透明
    'stroke-width':0.5//表格线宽
    },
    even:{//偶数行
    opacity:1,//不透明
    stroke:'#DDD',
    'stroke-width':0.5//表格线宽
    }
    }
    },{
    type:'Category',
    position:'bottom',
    fields:['name'],
    title:'年龄段',
    grid:true
    }],//轴
    series:[{
    type:'line',
    axis:'left',
    xField: 'name',
    yField: 'data',
    highlight:true,
    tips:{
    trackMouse: true,
    width: 140,
    height: 28,
    renderer: function(storeItem, item) {
    this.setTitle(storeItem.get('name') + ': ' +
    storeItem.get('data') + 'CM');
    }
    }
    }]//序列
    }]
    });
  • Column.js
      //定义数据集合
    var columnStore1 = Ext.create('Ext.data.JsonStore', {
    fields: ['name', 'data'],
    data: [
    {name:"0~10岁",data:20},
    {name:"11~18岁",data:60},
    {name:"19~24岁",data:30}
    ]
    });
    var b2 = Ext.create('Ext.Window', {
    width: 800,
    height: 600,
    hidden: false,
    closeAction:'hide',
    maximizable: true,
    title: '柱形图展示图表',
    layout: 'fit',
    tbar: [{
    text: '改变数据',
    handler: function() {
    columnStore1.loadData([
    {name:"0~10岁",data:50},
    {name:"11~18岁",data:30},
    {name:"19~24岁",data:20}
    ]);
    }
    }],
    items: {
    id: 'chartCmp',
    xtype: 'chart',
    style: 'background:#fff',
    animate: true,
    shadow: true,
    store: columnStore1,
    axes: [{//轴
    type: 'Numeric',
    position: 'left',
    fields: ['data'],
    title: '人数',
    grid: true,
    minimum: 0
    }, {
    type: 'Category',
    position: 'bottom',
    fields: ['name'],
    title: '年龄段'
    }],//序列
    series: [{
    type: 'column',
    axis: 'left',
    highlight: true,
    tips: {//提示
    trackMouse: true,
    width: 140,
    height: 28,
    renderer: function(storeItem,item) {
    this.setTitle(storeItem.get('name') + ': '
    + storeItem.get('data') + ' 名');
    }
    },
    //格式化
    renderer: function(sprite, record, attr, index, store){
    var fieldValue = Math.random() * 20 + 10;
    var value = (record.get('data') >> 0) % 3;
    var color = ['rgb(213, 70, 121)',
    'rgb(44, 153, 201)',
    'rgb(146, 6, 157)',
    'rgb(49, 149, 0)',
    'rgb(249, 153, 0)'][value];
    return Ext.apply(attr, {
    fill: color
    });
    } ,
    label: { //控制柱形图label
    display: 'insideEnd',
    'text-anchor': 'middle',
    field: 'data',
    renderer: Ext.util.Format.numberRenderer('0'),
    orientation: 'vertical',
    color: '#333'
    },
    xField: 'name',
    yField: 'data'
    }]
    }
    });
  • line.js
      //定义数据集合
    var columnStore2 = Ext.create('Ext.data.JsonStore', {
    fields: ['name', 'data1','data2','data3','data4'],
    data: [
    {name:"一月月考",data1:85,data2:76,data3:94,data4:80},
    {name:"二月月考",data1:96,data2:72,data3:87,data4:63},
    {name:"三月月考",data1:70,data2:66,data3:68,data4:78},
    {name:"四月月考",data1:90,data2:78,data3:76,data4:90}
    ]
    });
    var b3 = Ext.create('Ext.Window', {
    width: 800,
    height: 600,
    hidden: false,
    maximizable: true,
    closeAction:'hide',
    title: 'Line Chart',
    renderTo: Ext.getBody(),
    layout: 'fit',
    tbar: [{
    text: '产看另外一个人的成绩',
    handler: function() {
    columnStore2.loadData([
    {name:"一月月考",data1:75,data2:86,data3:84,data4:90},
    {name:"二月月考",data1:86,data2:62,data3:87,data4:93},
    {name:"三月月考",data1:80,data2:96,data3:68,data4:98},
    {name:"四月月考",data1:60,data2:98,data3:76,data4:60}
    ]);
    }
    }],
    items: {
    xtype: 'chart',
    style: 'background:#fff',
    animate: true,
    store: columnStore2,
    shadow: true,//阴影
    // mask: 'horizontal',//创建遮罩
    // listeners: {//配合遮罩用的隐藏
    // select: {
    // fn: function(me, selection) {
    // //me.setZoom(selection);
    // me.mask.hide();
    // }
    // }
    // },
    theme: 'Category1',
    legend: {
    position: 'right'
    },
    axes: [{//轴
    type: 'Numeric',
    minimum: 0,
    position: 'left',
    fields: ['data1', 'data2', 'data3', 'data4'],
    title: '分数',
    minorTickSteps: 1,//内部去也的跨度
    grid: {
    odd: {
    opacity: 1,
    fill: '#ddd',
    stroke: '#bbb',
    'stroke-width': 0.5
    }
    }
    }, {
    type: 'Category',
    position: 'bottom',
    fields: ['name'],
    title: '历次考试'
    }],
    series: [{//序列1
    type: 'line',
    highlight: {
    size: 7,
    radius: 7
    },
    axis: 'left',
    xField: 'name',
    yField: 'data1',//展示在图例上的
    title :'语文',
    markerConfig: {//标记配置
    type: 'cross',//交叉
    size: 4,
    radius: 4,
    'stroke-width': 0
    }
    },{//序列2
    type: 'line',
    highlight: {
    size: 7,
    radius: 7
    },
    axis: 'left',
    xField: 'name',
    yField: 'data2',
    title :'数学',
    markerConfig: {
    type: 'cross',
    size: 4,
    radius: 4,
    'stroke-width': 0
    }
    }, {
    type: 'line',
    highlight: {
    size: 7,
    radius: 7
    },
    axis: 'left',//位置
    smooth: true,
    xField: 'name',
    yField: 'data3',
    title :'英语',
    markerConfig: {
    type: 'cross',
    size: 4,
    radius: 4,
    'stroke-width': 0
    }
    }, {
    type: 'line',
    highlight: {
    size: 7,
    radius: 7
    },
    axis: 'left',
    smooth: true,
    fill: true,//填充颜色
    xField: 'name',
    yField: 'data4',
    title :'计算机',
    markerConfig: {
    type: 'circle',//圈
    size: 4,
    radius: 4,
    'stroke-width': 0
    }
    }]
    }
    });
  • Pie.js

    var columnStore5 = Ext.create('Ext.data.JsonStore', {
    fields: ['name', 'data'],
    data: [
    {name:"0~10岁",data:20},
    {name:"11~18岁",data:60},
    {name:"19~24岁",data:30}
    ]
    });
    var b4 = Ext.create('Ext.Window', {
    width: 800,
    height: 600,
    title: '饼图示例',
    layout: 'fit',
    closeAction:'hide',
    tbar: [{
    text: '数据变换',
    handler: function() {
    columnStore5.loadData([
    {name:"0~10岁",data:40},
    {name:"11~18岁",data:20},
    {name:"19~24岁",data:40}
    ]);
    }
    }, {
    enableToggle: true,
    pressed: false,
    text: 'Donut(设置内圆)',
    toggleHandler: function(btn, pressed) {
    var chart = Ext.getCmp('chartCmp');
    //设置图标序列的模式
    chart.series.first().donut = pressed ? 35 : false;//内弧度
    chart.refresh();
    }
    }],
    items: {
    xtype: 'chart',
    id: 'chartCmp',
    animate: true,
    store: columnStore5,
    shadow: true,
    legend: {
    position: 'right'
    },
    insetPadding: 60,
    theme: 'Base:gradients',
    series: [{
    type: 'pie',
    field: 'data',
    showInLegend: true,
    donut: false,//内环状线圈
    tips: {//提示
    trackMouse: true,
    width: 140,
    height: 28,
    renderer: function(storeItem, item) {
    var total = 0;
    columnStore5.each(function(rec) {
    total += rec.get('data');
    });
    this.setTitle(storeItem.get('name') + ': '
    + Math.round(storeItem.get('data')/total*100)
    + '%');
    }
    },
    highlight: {//高亮
    segment: {
    margin: 20
    }
    },
    label: {
    field: 'name',
    display: 'rotate',
    contrast: true,
    font: '18px Arial'
    }
    }]
    }
    });
  • Bar.js
    
    
      var columnStore6 =  Ext.create('Ext.data.JsonStore', {
    fields: ['name', 'data'],
    data: [
    {name:"0~10岁",data:122},
    {name:"11~18岁",data:163},
    {name:"19~24岁",data:234},
    {name:"15~35岁",data:737},
    {name:"36~42岁",data:453},
    {name:"43~60岁",data:540}
    ]
    });
    var b5 = Ext.create('Ext.Window', {
    width: 800,
    height: 600,
    hidden: false,
    maximizable: true,
    title: 'Bar Renderer',
    renderTo: Ext.getBody(),
    layout: 'fit',
    tbar: [{
    text: '重新装载数据',
    handler: function() {
    columnStore6.loadData( [
    {name:"0~10岁",data:221},
    {name:"11~18岁",data:363},
    {name:"19~24岁",data:135},
    {name:"15~35岁",data:432},
    {name:"36~42岁",data:756},
    {name:"43~60岁",data:649}
    ]);
    }
    }],
    items: {
    xtype: 'chart',
    animate: true,
    style: 'background:#fff',
    shadow: false,//阴影
    store: columnStore6,
    axes: [{
    type: 'Numeric',
    position: 'bottom',
    fields: ['data'],
    label: {
    renderer: Ext.util.Format.numberRenderer('0,0')
    },
    title: '人数',
    minimum: 0
    }, {
    type: 'Category',
    position: 'left',
    fields: ['name'],
    title: '年龄分布'
    }],
    series: [{
    type: 'bar',
    axis: 'bottom',
    label: {
    display: 'insideEnd',
    field: 'data1',
    renderer: Ext.util.Format.numberRenderer('0'),
    orientation: 'horizontal',
    color: '#333',
    'text-anchor': 'middle',
    contrast: true
    },
    xField: 'name',
    yField: ['data'],
    renderer: function(sprite, record, attr, index, store) {
    var fieldValue = Math.random() * 20 + 10;
    var value = (record.get('data') >> 0) % 5;
    var color = ['rgb(213, 70, 121)',
    'rgb(44, 153, 201)',
    'rgb(146, 6, 157)',
    'rgb(49, 149, 0)',
    'rgb(249, 153, 0)'][value];
    return Ext.apply(attr, {
    fill: color
    });
    }
    }]
    }
    });
  • area.js
     //Ext.onReady(function () {
    var columnStore7 = Ext.create('Ext.data.JsonStore', {
    fields: ['name', 'data1','data2','data3','data4'],
    data: [
    {name:"一月月考",data1:85,data2:76,data3:94,data4:80},
    {name:"二月月考",data1:96,data2:72,data3:87,data4:63},
    {name:"三月月考",data1:70,data2:66,data3:68,data4:78},
    {name:"四月月考",data1:90,data2:78,data3:76,data4:90}
    ]
    });
    var b6 = Ext.create('Ext.Window', {
    width: 800,
    height: 600,
    hidden: false,
    shadow: false,
    maximizable: true,
    title: 'Area Chart',
    renderTo: Ext.getBody(),
    layout: 'fit',
    tbar: [{
    text: '切换数据',
    handler: function() {
    columnStore7.loadData([
    {name:"一月月考",data1:75,data2:86,data3:84,data4:90},
    {name:"二月月考",data1:86,data2:62,data3:87,data4:93},
    {name:"三月月考",data1:80,data2:96,data3:68,data4:98},
    {name:"四月月考",data1:60,data2:98,data3:76,data4:60}
    ]);
    }
    }, {
    enableToggle: true,
    pressed: true,
    text: '动画开启|关闭',
    toggleHandler: function(btn, pressed) {
    var chart = Ext.getCmp('chartCmp');
    chart.animate = pressed?{easing: 'ease', duration: 500 }:false;
    }
    }],
    items: {
    id: 'chartCmp',
    xtype: 'chart',
    style: 'background:#fff',
    animate: true,
    store: columnStore7,
    legend: {
    position: 'bottom'
    },
    axes: [{
    type: 'Numeric',
    grid: true,
    position: 'left',//位置
    fields: ['data1', 'data2', 'data3', 'data4'],
    title: '分数分布',
    grid: {
    odd: {
    opacity: 1,
    fill: '#ddd',
    stroke: '#bbb',
    'stroke-width': 1
    }
    },
    minimum: 0,
    adjustMinimumByMajorUnit: 0
    }, {
    type: 'Category',
    position: 'bottom',
    fields: ['name'],
    title: '每月考试',
    grid: true,
    label: {
    rotate: {
    degrees: 315
    }
    }
    }],
    series: [{
    type: 'area',
    highlight: false,
    axis: 'left',
    xField: 'name',
    yField: ['data1', 'data2', 'data3', 'data4'],
    style: {
    opacity: 0.93
    }
    }]
    }
    });
    //})
  • area.js(加)
    Ext.require('Ext.chart.*');
    Ext.require('Ext.data.*');
    Ext.require('Ext.Window');
    Ext.require('Ext.layout.container.Fit');
    Ext.require('Ext.fx.target.Sprite');
    //规划数据
    var jsonData = [
    {
    date: '1/1/2009',
    IE: 44.8,
    Firefox: 45.5,
    Chrome: 3.9,
    Safari: 3,
    Opera: 2.3,
    Other: 0.5
    },
    {
    date: '2/1/2009',
    IE: 43.6,
    Firefox: 46.4,
    Chrome: 4,
    Safari: 3,
    Opera: 2.2,
    Other: 0.8
    },
    {
    date: '3/1/2009',
    IE: 43.3,
    Firefox: 46.5,
    Chrome: 4.2,
    Safari: 3.1,
    Opera: 2.3,
    Other: 0.6
    },
    {
    date: '4/1/2009',
    IE: 42.1,
    Firefox: 47.1,
    Chrome: 4.9,
    Safari: 3,
    Opera: 2.2,
    Other: 0.7
    },
    {
    date: '5/1/2009',
    IE: 41,
    Firefox: 47.7,
    Chrome: 5.5,
    Safari: 3,
    Opera: 2.2,
    Other: 0.6
    },
    {
    date: '6/1/2009',
    IE: 40.7,
    Firefox: 47.3,
    Chrome: 6,
    Safari: 3.1,
    Opera: 2.1,
    Other: 0.8
    },
    {
    date: '7/1/2009',
    IE: 39.4,
    Firefox: 47.9,
    Chrome: 6.5,
    Safari: 3.3,
    Opera: 2.1,
    Other: 0.8
    },
    {
    date: '8/1/2009',
    IE: 39.3,
    Firefox: 47.4,
    Chrome: 7,
    Safari: 3.3,
    Opera: 2.1,
    Other: 0.9
    },
    {
    date: '9/1/2009',
    IE: 39.6,
    Firefox: 46.6,
    Chrome: 7.1,
    Safari: 3.6,
    Opera: 2.2,
    Other: 0.9
    },
    {
    date: '10/1/2009',
    IE: 37.5,
    Firefox: 47.5,
    Chrome: 8,
    Safari: 3.8,
    Opera: 2.3,
    Other: 0.9
    },
    {
    date: '11/1/2009',
    IE: 37.7,
    Firefox: 47,
    Chrome: 8.5,
    Safari: 3.8,
    Opera: 2.3,
    Other: 0.7
    },
    {
    date: '12/1/2009',
    IE: 37.2,
    Firefox: 46.4,
    Chrome: 9.8,
    Safari: 3.6,
    Opera: 2.3,
    Other: 0.7
    },
    {
    date: '1/1/2010',
    IE: 36.2,
    Firefox: 46.3,
    Chrome: 10.8,
    Safari: 3.7,
    Opera: 2.2,
    Other: 0.8
    },
    {
    date: '2/1/2010',
    IE: 35.3,
    Firefox: 46.5,
    Chrome: 11.6,
    Safari: 3.8,
    Opera: 2.1,
    Other: 0.7
    },
    {
    date: '3/1/2010',
    IE: 34.9,
    Firefox: 46.2,
    Chrome: 12.3,
    Safari: 3.7,
    Opera: 2.2,
    Other: 0.7
    },
    {
    date: '4/1/2010',
    IE: 33.4,
    Firefox: 46.4,
    Chrome: 13.6,
    Safari: 3.7,
    Opera: 2.2,
    Other: 0.7
    },
    {
    date: '5/1/2010',
    IE: 32.2,
    Firefox: 46.9,
    Chrome: 14.5,
    Safari: 3.5,
    Opera: 2.2,
    Other: 0.7
    },
    {
    date: '6/1/2010',
    IE: 31,
    Firefox: 46.6,
    Chrome: 15.9,
    Safari: 3.6,
    Opera: 2.1,
    Other: 0.8
    },
    {
    date: '7/1/2010',
    IE: 30.4,
    Firefox: 46.4,
    Chrome: 16.7,
    Safari: 3.4,
    Opera: 2.3,
    Other: 0.8
    },
    {
    date: '8/1/2010',
    IE: 30.7,
    Firefox: 45.8,
    Chrome: 17,
    Safari: 3.5,
    Opera: 2.3,
    Other: 0.7
    },
    {
    date: '9/1/2010',
    IE: 31.1,
    Firefox: 45.1,
    Chrome: 17.3,
    Safari: 3.7,
    Opera: 2.2,
    Other: 0.6
    },
    {
    date: '10/1/2010',
    IE: 29.7,
    Firefox: 44.1,
    Chrome: 19.2,
    Safari: 3.9,
    Opera: 2.2,
    Other: 0.9
    },
    {
    date: '11/1/2010',
    IE: 28.6,
    Firefox: 44,
    Chrome: 20.5,
    Safari: 4.0,
    Opera: 2.3,
    Other: 0.6
    },
    {
    date: '12/1/2010',
    IE: 27.5,
    Firefox: 43.5,
    Chrome: 22.4,
    Safari: 3.8,
    Opera: 2.2,
    Other: 0.6
    }
    ];
    //数据fields数据抽取
    var fields = ['IE', 'Chrome', 'Firefox', 'Safari', 'Opera', 'Other'];
    //创建数据
    var browserStore = Ext.create('Ext.data.JsonStore', {
    fields: fields,
    data: jsonData
    }); var colors = ['rgb(47, 162, 223)',
    'rgb(60, 133, 46)',
    'rgb(234, 102, 17)',
    'rgb(154, 176, 213)',
    'rgb(186, 10, 25)',
    'rgb(40, 40, 40)'];
    //扩展原始类[Ext.chart.theme.Base]属性colors
    Ext.chart.theme.Browser = Ext.extend(Ext.chart.theme.Base, {
    constructor: function(config) {
    Ext.chart.theme.Base.prototype.constructor.call(this, Ext.apply({
    colors: colors
    }, config));
    }
    }); var b7 = Ext.create('Ext.Window', {
    width: 800,
    height: 600,
    hidden: false,
    shadow: false,
    maximizable: false,
    title: '浏览器使用分布',
    //renderTo: Ext.getBody(),
    layout: 'fit',
    items: {
    id: 'chartCmp',
    xtype: 'chart',
    style: 'background:#fff',
    animate: true,
    theme: 'Browser:gradients',//皮肤
    defaultInsets: 30,
    store: browserStore,//数据引用
    legend: {
    position: 'right'//图例的设置
    },
    axes: [{//轴
    type: 'Numeric',
    position: 'left',
    fields: fields,
    title: '使用率 %',
    grid: true,
    decimals: 0,//小数进位数值 默认是2
    minimum: 0,//设置最小数值,如果没有设置则按章数据的最小数值自动计算
    maximum: 100//设置最大数值,如果没有设置则按照数据的最大数值自动计算
    }, {
    type: 'Category',//类型轴
    position: 'bottom',
    fields: ['date'],
    title: '2011年月度分布',
    label: {
    renderer: function(v) {
    return v.match(/([0-9]*)\/[0-9]*\/[0-9][0-9]([0-9]*)/).slice(1).join('/');
    }
    }
    }],
    series: [{
    type: 'area',//面积图
    axis: 'left',
    highlight: true,//高亮
    tips: {//提示
    trackMouse: true,
    width: 170,
    height: 28,
    renderer: function(storeItem, item) {
    this.setTitle(item.storeField + ' - '
    + Ext.Date.format(new Date(storeItem.get('date')), 'M y')
    + ' - ' + storeItem.get(item.storeField) + '%');
    }
    },
    xField: 'name',
    yField: fields,
    style: {
    lineWidth: 1,
    stroke: '#666',
    opacity: 0.86
    }
    }]
    }
    });
  • Gauge.js

    var s1 = Ext.create('Ext.data.JsonStore', {
    fields: ['name', 'data'],
    data: [
    {name:"0~10岁",data:20}
    ]
    });
    var s2 = Ext.create('Ext.data.JsonStore', {
    fields: ['name', 'data'],
    data: [
    {name:"0~10岁",data:50}
    ]
    });
    var s3 = Ext.create('Ext.data.JsonStore', {
    fields: ['name', 'data'],
    data: [
    {name:"0~10岁",data:30}
    ]
    });
    var b8 = Ext.create('Ext.Window', {
    width: 800,
    height: 250,
    minWidth: 650,
    minHeight: 225,
    title: 'Gauge Charts',
    tbar: [{
    text: '装载新的数据',
    handler: function() {
    s1.loadData([
    {name:"0~10岁",data:50}
    ]);
    s2.loadData([
    {name:"0~10岁",data:20}
    ]);
    s3.loadData([
    {name:"0~10岁",data:70}
    ]);
    }
    }],
    layout: {
    type: 'hbox',
    align: 'stretch'
    },
    items: [{//第一个仪表图
    xtype: 'chart',
    style: 'background:#fff',
    animate: {
    easing: 'elasticIn',
    duration: 1000
    },
    store: s1,
    insetPadding: 25,
    flex: 1,
    axes: [{
    type: 'gauge',
    position: 'gauge',
    minimum: 0,
    maximum: 100,
    steps: 10,
    margin: -10
    }],
    series: [{
    type: 'gauge',
    field: 'data',
    donut: false,
    colorSet: ['#F49D10', '#ddd']
    }]
    }, {//第二个仪表图
    xtype: 'chart',
    style: 'background:#fff',
    animate: true,
    store: s2,
    insetPadding: 25,
    flex: 1,
    axes: [{
    type: 'gauge',
    position: 'gauge',
    minimum: 0,
    maximum: 100,
    steps: 10,
    margin: 7
    }],
    series: [{
    type: 'gauge',
    field: 'data',
    donut: 30,
    colorSet: ['#82B525', '#ddd']
    }]
    }, {//第三个仪表图
    xtype: 'chart',
    style: 'background:#fff',
    animate: {
    easing: 'bounceOut',
    duration: 500
    },
    store: s3,
    insetPadding: 25,
    flex: 1,
    axes: [{
    type: 'gauge',
    position: 'gauge',
    minimum: 0,
    maximum: 100,
    steps: 10,
    margin: 7
    }],
    series: [{
    type: 'gauge',
    field: 'data',
    donut: 80,
    colorSet: ['#3AA8CB', '#ddd']
    }]
    }]
    })
  • Radar.js

    var columnStore9 = Ext.create('Ext.data.JsonStore', {
    fields: ['name', 'data1','data2','data3','data4'],
    data: [
    {name:"一月月考",data1:85,data2:76,data3:94},
    {name:"二月月考",data1:96,data2:72,data3:87},
    {name:"三月月考",data1:70,data2:66,data3:68},
    {name:"四月月考",data1:50,data2:88,data3:56},
    {name:"五月月考",data1:80,data2:88,data3:36},
    {name:"六月月考",data1:40,data2:68,data3:96},
    {name:"七月月考",data1:60,data2:88,data3:86},
    {name:"八月月考",data1:70,data2:88,data3:96},
    {name:"九月月考",data1:80,data2:98,data3:66},
    {name:"十月月考",data1:90,data2:78,data3:76},
    {name:"十一月月考",data1:90,data2:78,data3:76},
    {name:"十二月月考",data1:90,data2:78,data3:76}
    ]
    });
    var b9 = Ext.create('Ext.Window', {
    width: 800,
    height: 600,
    hidden: false,
    shadow: false,
    maximizable: true,
    style: 'overflow: hidden;',
    title: 'Radar Chart',
    renderTo: Ext.getBody(),
    layout: 'fit',
    tbar: [{
    text: '装载数据',
    handler: function() {
    columnStore9.loadData( [
    {name:"一月月考",data1:75,data2:86,data3:74},
    {name:"二月月考",data1:96,data2:82,data3:87},
    {name:"三月月考",data1:70,data2:96,data3:68},
    {name:"四月月考",data1:50,data2:78,data3:56},
    {name:"五月月考",data1:90,data2:88,data3:36},
    {name:"六月月考",data1:80,data2:68,data3:96},
    {name:"七月月考",data1:60,data2:88,data3:86},
    {name:"八月月考",data1:70,data2:98,data3:86},
    {name:"九月月考",data1:88,data2:98,data3:66},
    {name:"十月月考",data1:70,data2:88,data3:96},
    {name:"十一月月考",data1:90,data2:78,data3:76},
    {name:"十二月月考",data1:90,data2:98,data3:76}
    ]);
    }
    }, {
    enableToggle: true,
    pressed: true,
    text: 'Animate',
    toggleHandler: function(btn, pressed) {
    var chart = Ext.getCmp('chartCmp');
    chart.animate = pressed ? { easing: 'ease', duration: 500 } : false;
    }
    }],
    items: {
    id: 'chartCmp',
    xtype: 'chart',
    style: 'background:#fff',
    theme: 'Category2',
    animate: true,
    store: columnStore9,
    insetPadding: 20,
    legend: {
    position: 'right'//图例
    },
    axes: [{//轴
    type: 'Radial',
    position: 'radial',
    label: {
    display: true
    }
    }],
    series: [{
    type: 'radar',
    xField: 'name',
    yField: 'data1',
    showInLegend: true,//展示在图例
    showMarkers: true,
    markerConfig: {
    radius: 5,
    size: 5
    },
    style: {
    'stroke-width': 2,
    //fill: 'yellow'//没有填充
    fill:'none'
    }
    },{
    type: 'radar',
    xField: 'name',
    yField: 'data2',
    showInLegend: true,
    showMarkers: true,
    markerConfig: {
    radius: 5,
    size: 5
    },
    style: {
    'stroke-width': 2,
    fill: 'none'
    }
    },{
    type: 'radar',
    xField: 'name',
    yField: 'data3',
    showMarkers: true,
    showInLegend: true,
    markerConfig: {
    radius: 5,
    size: 5
    },
    style: {
    'stroke-width': 2,
    fill: 'none'
    }
    }]
    }
    });
  • demo.js
     var chart;
    var generateData = (function() {
    var data = [], i = 0,
    last = false,
    date = new Date(2011, 1, 1),
    seconds = +date,
    min = Math.min,
    max = Math.max,
    random = Math.random;
    return function() {
    data = data.slice();
    data.push({
    date: Ext.Date.add(date, Ext.Date.DAY, i++),
    visits: min(100, max(last? last.visits + (random() - 0.5) * 20 : random() * 100, 0)),
    views: min(100, max(last? last.views + (random() - 0.5) * 10 : random() * 100, 0)),
    users: min(100, max(last? last.users + (random() - 0.5) * 20 : random() * 100, 0))
    });
    last = data[data.length -1];
    return data;
    };
    })(); var group = false,
    groupOp = [{
    dateFormat: 'M d',
    groupBy: 'year,month,day'
    }, {
    dateFormat: 'M',
    groupBy: 'year,month'
    }]; function regroup() {
    group = !group;
    var axis = chart.axes.get(1),
    selectedGroup = groupOp[+group];
    axis.dateFormat = selectedGroup.dateFormat;
    axis.groupBy = selectedGroup.groupBy;
    chart.redraw();
    } var store = Ext.create('Ext.data.JsonStore', {
    fields: ['date', 'visits', 'views', 'users'],
    data: generateData()
    });
    //关键函数
    var intr = setInterval(function() {
    var gs = generateData();
    var toDate = timeAxis.toDate,
    lastDate = gs[gs.length - 1].date,
    markerIndex = chart.markerIndex || 0;
    if (+toDate < +lastDate) {
    markerIndex = 1;
    timeAxis.toDate = lastDate;
    timeAxis.fromDate = Ext.Date.add(Ext.Date.clone(timeAxis.fromDate), Ext.Date.DAY, 1);
    chart.markerIndex = markerIndex;
    }
    store.loadData(gs);
    }, 1000); var b10 = Ext.create('Ext.Window', {
    width: 800,
    height: 600,
    hidden: false,
    maximizable: true,
    title: 'Live Animated Chart',
    renderTo: Ext.getBody(),
    layout: 'fit',
    items: [{
    xtype: 'chart',
    style: 'background:#fff',
    id: 'chartCmp',
    store: store,
    shadow: false,
    animate: true,
    axes: [{
    type: 'Numeric',
    grid: true,
    minimum: 0,
    maximum: 100,
    position: 'left',
    fields: ['views', 'visits', 'users'],
    title: 'Number of Hits',
    grid: {
    odd: {
    fill: '#dedede',
    stroke: '#ddd',
    'stroke-width': 0.5
    }
    }
    }, {
    type: 'Time',
    position: 'bottom',
    fields: 'date',
    title: 'Day',
    dateFormat: 'M d',
    groupBy: 'year,month,day',
    aggregateOp: 'sum', constrain: true,
    fromDate: new Date(2011, 1, 1),
    toDate: new Date(2011, 1, 7),
    grid: true
    }],
    series: [{
    type: 'line',
    smooth: false,
    axis: 'left',
    xField: 'date',
    yField: 'visits',
    label: {
    display: 'none',
    field: 'visits',
    renderer: function(v) { return v >> 0; },
    'text-anchor': 'middle'
    },
    markerConfig: {
    radius: 5,
    size: 5
    }
    },{
    type: 'line',
    axis: 'left',
    smooth: false,
    xField: 'date',
    yField: 'views',
    label: {
    display: 'none',
    field: 'visits',
    renderer: function(v) { return v >> 0; },
    'text-anchor': 'middle'
    },
    markerConfig: {
    radius: 5,
    size: 5
    }
    },{
    type: 'line',
    axis: 'left',
    smooth: false,
    xField: 'date',
    yField: 'users',
    label: {
    display: 'none',
    field: 'visits',
    renderer: function(v) { return v >> 0; },
    'text-anchor': 'middle'
    },
    markerConfig: {
    radius: 5,
    size: 5
    }
    }]
    }]
    });
    chart = Ext.getCmp('chartCmp');
    var timeAxis = chart.axes.get(1);
  • demo.js(加)
      var columnStore11 =  Ext.create('Ext.data.JsonStore', {
    fields: ['name', 'data'],
    data: [
    {name:"0~10岁",data:20},
    {name:"11~18岁",data:60},
    {name:"19~24岁",data:30}
    ]
    });
    var b11 = Ext.create('Ext.Window', {
    width: 800,
    height: 600,
    hidden: false,
    maximizable: true,
    title: 'Pie Renderer Chart',
    renderTo: Ext.getBody(),
    layout: 'fit',
    tbar: [{
    text: 'Reload Data',
    handler: function() {
    columnStore11.loadData([
    {name:"0~10岁",data:40},
    {name:"11~18岁",data:20},
    {name:"19~24岁",data:40}
    ]);
    }
    }],
    items: {
    id: 'chartCmp',
    xtype: 'chart',
    style: 'background:#fff',
    animate: true,
    shadow: true,
    store: columnStore11,
    series: [{
    type: 'pie',
    animate: true,
    angleField: 'data', //角度
    lengthField: 'data', //字段切点长度
    highlight: {
    segment: {
    margin: 20
    }
    },
    label: {
    field: 'name', //文本标注
    display: 'rotate', //旋转标签 (also middle, out).
    font: '14px Arial',
    contrast: true
    },
    style: {
    'stroke-width': 1,
    'stroke': '#fff'
    },
    //add renderer
    renderer: function(sprite, record, attr, index, store) {//格式化重要函数
    var value = (record.get('data') >> 0) % 9;
    var color = [ "#94ae0a", "#115fa6","#a61120", "#ff8809", "#ffd13e", "#a61187", "#24ad9a", "#7c7474", "#a66111"][value];
    return Ext.apply(attr, {
    fill: color
    });
    }
    }]
    }
    });
  • Numeric.js
    Ext.onReady(function(){
    Ext.get("b1").on("click",function(){
    b1.show()
    })
    Ext.get("b2").on("click",function(){
    b2.show()
    })
    Ext.get("b3").on("click",function(){
    b3.show()
    })
    Ext.get("b4").on("click",function(){
    b4.show()
    })
    Ext.get("b5").on("click",function(){
    b5.show()
    })
    Ext.get("b6").on("click",function(){
    b6.show()
    })
    Ext.get("b7").on("click",function(){
    b7.show()
    })
    Ext.get("b8").on("click",function(){
    b8.show()
    })
    Ext.get("b9").on("click",function(){
    b9.show()
    })
    Ext.get("b10").on("click",function(){
    b10.show()
    })
    Ext.get("b11").on("click",function(){
    b11.show()
    })
    });
上一篇:C++ log4cplus 类库的封装


下一篇:php复制目录及文件