zoukankan      html  css  js  c++  java
  • Ext2.0的通用grid包括(增、删、改、查、导出excel)

    下面为扩张grid的 代码
    1. /**
    2.  * @auther huangfeng
    3.  * @class   Ext.ux.GridExtend
    4.  * 通用的grid
    5.  */
    6. Ext.ux.GridExtend=function(config){
    7.     Ext.QuickTips.init();
    8.     this.config=config;

    9.     this.filters=this.config.filters||'';
    10.     
    11.     
    12.     /**
    13.      *  @param  {String}
    14.      * 显示列表的id
    15.      */
    16.     this.el=this.config.el||document.body;
    17.     /**
    18.      * @param   {String}
    19.      * 读取编辑数据的form的url
    20.      */
    21.     this.editUrl=this.config.editUrl;
    22.     /**
    23.      * @param   {String}
    24.      * 读取编辑数据的form的url
    25.      */
    26.     this.deleteUrl=this.config.deleteUrl;
    27.     /**
    28.      * @param   {String}
    29.      * 读取列表数据的url
    30.      */
    31.     this.storeUrl=this.config.storeUrl;
    32.     /**
    33.      * @param   {String}
    34.      * 保存添加到列表数据的url
    35.      */
    36.     this.formSaveUrl=this.config.formSaveUrl;
    37.     /**
    38.      * @param   {String}
    39.      * 列表的标题
    40.      */
    41.     this.title=this.config.title||'';
    42.     /**
    43.      * @param   {Array}
    44.      * 列表顶部状态栏
    45.      */
    46.     this.tbar=this.config.tbar||[{//grid顶部栏位
    47.             text:'添加',                  //按钮的名称
    48.             tooltip:'添加数据',             //鼠标停留在按钮上的提示
    49.             iconCls:'add',                  //按钮图表的类
    50.             handler:this.newInfo.createDelegate(this)           //处理按钮被点击时触发的时间函数
    51.         },'-',{//'-'为多按钮间隔符
    52.             text:'删除',                  //删除按钮的名称
    53.             tooltip:'删除数据',             //鼠标停留在按钮上的提示
    54.             iconCls:'remove',               //按钮图表的类
    55.             handler:this.handlerDelete.createDelegate(this)         //处理按钮被点击时触发的时间函数
    56.         },'-',{
    57.             text:'导出Excel',                 //删除按钮的名称
    58.             tooltip:'导出Excel',              //鼠标停留在按钮上的提示
    59.             iconCls:'exportExcel',
    60.             handler:this.exportExcel.createDelegate(this)           //处理按钮被点击时触发的时间函数
    61.         }];

    62.     /**
    63.      * @param   选择框对象
    64.      */
    65.     this.sm=this.config.sm||new Ext.grid.CheckboxSelectionModel({//start Ext.grid.CheckboxSelectionModel
    66.         singleSelect:false                  //是否只能选择一个
    67.     });
    68.     /**
    69.      * @param   {Array}
    70.      * 列表的栏的前面数据
    71.      */
    72.     this.cmDataArrayBefore=[//start Ext.grid.ColumnModel
    73.         //defaultSortable:true,             //默认情况下为排序
    74.         new Ext.grid.RowNumberer(),         //数据函数序列号
    75.         this.sm
    76.     ];
    77.     /**
    78.      * @param   {Array}
    79.      * 显示的内容是从后台读取出来的数据,所以此数据中的dataIndex属性要与<br>
    80.      * 从后台读取的字段要一致
    81.      */
    82.     this.cmDataArray=this.config.cmDataArray||[];
    83.     /**
    84.      * @param   {Array}
    85.      * 列表的栏的后面数据
    86.      */
    87.     this.cmDataArrayAfter=this.config.cmDataArrayAfter||[];
    88.     /**
    89.      * @param   {Ext.grid.ColumnModel}
    90.      * 列表的栏位数据
    91.      */
    92.     this.cm=this.config.cm||new Ext.grid.ColumnModel(
    93.             this.cmDataArrayBefore.concat(this.cmDataArray).concat(this.cmDataArrayAfter)
    94.     );//end Ext.grid.ColumnModel    
    95.     
    96.     /**
    97.      * @param   {Array}
    98.      * 读取gridStore数据的字段设置数据对象
    99.      */
    100.     this.gridStoreFields=this.config.gridStoreFields||new Array();
    101.     
    102.     /*
    103.      * 如果this.gridStoreFields中没有数据,把this.cmDataArray中的dataIndex的属性值<br>
    104.      * 赋予gridStoreFields数组中对象的name属性值
    105.      */
    106.     if(this.gridStoreFields.length==0){
    107.         for(var i=0,len=this.cmDataArray.length;i<len;i++){
    108.             this.gridStoreFields[i]={name:this.cmDataArray[i].dataIndex};
    109.         }
    110.     }
    111.     
    112.     /**
    113.      * @param   {new Ext.data.Store}
    114.      * 从后台读取的列表内容
    115.      */ 
    116.     this.gridStore=this.config.gridStore||new Ext.data.Store({//start Ext.data.Store
    117.         proxy:new Ext.data.HttpProxy({
    118.             url:this.storeUrl                   //读取数据的url
    119.         }),
    120.         reader:new Ext.data.JsonReader({//start Ext.data.JsonReader
    121.             root:'rows',                    //存储数据的属性
    122.             totalProperty:'results',        //总共的页数
    123.             id:'uniqueCode'                 //每行的id值
    124.         },                                  //end Ext.data.JsonReader
    125.         this.gridStoreFields)
    126.     });//end Ext.data.Store
    127.     
    128.     this.gridStore.load({params:{start: 0, limit: 10}});
    129.     /**
    130.      * @param   {Ext.PagingToolbar}
    131.      * 底部状态栏
    132.      */
    133.     this.bbar=this.config.bbar||new Ext.PagingToolbar({     //在grid底层添加分页工具栏
    134.             pageSize:10,                    //显示的数据条数
    135.             store:this.gridStore,           //选择翻页按钮时的加载到grid的数据
    136.             displayInfo:true,               //设置是否显示分页栏的信息
    137.             displayMsg:'显示第 {0} 条到 {1} 条记录,一共 {2} 条',//消息栏的页数信息
    138.             emptyMsg:"没有记录"             //当没有记录时要显示的信息
    139.         });//end bbar
    140.     /**
    141.      * 如果要设置此参数必须在cm中设置相应的id
    142.      */
    143.     this.autoExpandColumn=this.config.autoExpandColumn||'';
    144.         
    145.     /**
    146.      * @param   {Object}
    147.      * 默认情况下有此显现,如果不需要可以为false
    148.      * 必须含有下列参数:<br>
    149.      * loadingEL        {String}    加载页面时显示的内容id<br>
    150.      * loadingMaskEl    {String}    渐显的内容id<br> 
    151.      */ 
    152.     this.loadingMark=this.config.loadingMark||{
    153.         loadingEL:'loading',
    154.         loadingMaskEL:'loading-mask'
    155.     };
    156.     /**
    157.      * @param   {Ext.grid.GridPanel}
    158.      * @private
    159.      */
    160.     this.grid=this.config.gridStore||new Ext.grid.GridPanel({
    161.         //el:this.el,                           //显示grid对象的层ID.
    162.         store:this.gridStore,                   // grid装载的数据.
    163.         viewConfig:{
    164.             autoFill:true,
    165.             deferEmptyText:'请等待...',
    166.             emptyText:'没有数据',
    167.             enableRowBody:true
    168.         }, 
    169.         sm:this.sm,                             //在每行数据前添加的一组checkBox
    170.         height:Ext.get(this.el).getComputedHeight(),
    171.         //autoHeight:true,
    172.         loadMask:true, 
    173.         maskDisabled:true,
    174.         cm:this.cm,                             //设置栏位.
    175.         title:this.title,                       //标题名称.
    176.         iconCls:'icon-grid',                //标题前的图片css类
    177.         autoExpandColumn:this.autoExpandColumn,
    178.         plugins: this.filters,
    179.         bbar:this.bbar,
    180.         tbar:this.tbar
    181.     });
    182.     
    183.     this.formFields=this.config.formFields||new Array();
    184.     
    185.     /**
    186.      * 双击数据的事件,弹出一个编辑此条数据的层 
    187.      * @param   grid        此列表的对象
    188.      * @param   rowIndex    在列表中的行数
    189.      * @param   e           触发此事件的事件对象
    190.      */
    191.     this.rowdblclick=this.config.rowdblclick||function(grid, rowIndex, e){
    192.         var selectId=this.gridStore.data.items[rowIndex].id;
    193.         this.editInfo(selectId);
    194.     };
    195.     this.grid.on('rowdblclick',this.rowdblclick.createDelegate(this));
    196.     this.grid.render(this.el);
    197.     
    198.     //当js加载完毕后删除loading页面并渐显内容
    199.     if(this.loadingMark){
    200.         setTimeout(function(){
    201.             Ext.get(this.loadingMark.loadingEL).remove();
    202.             Ext.get(this.loadingMark.loadingMaskEL).fadeOut({remove:true});
    203.         }.createDelegate(this), 250);
    204.     }   
    205. }

    206. Ext.ux.GridExtend.prototype={
    207.     /**
    208.      * 加载 form表单的数据
    209.      * @param   selectId    选择此条数据的唯一标识码,此参数发送到后台处理
    210.      */
    211.     editInfo:function(selectId){
    212.         var form=this.getForm();
    213.         
    214.         form.form.load({//start load 参数设置
    215.             url:this.editUrl,
    216.             params:{
    217.                 uniqueCode:selectId
    218.             },
    219.             waitMsg:'Loading..'
    220.         });//end load 参数设置
    221.         
    222.         this.formWindow(form,'编辑');
    223.     },
    224.     getForm:function(){
    225.         //错误信息放在右边
    226.         Ext.form.Field.prototype.msgTarget = 'side';
    227.         //var formSaveUrl=this.formSaveUrl;
    228.         //var formFields=this.formFields;
    229.         var formSaveUrl=Ext.clone(this.formSaveUrl);
    230.         var formFields=Ext.clone(this.formFields);
    231.         
    232.         //实例化form面板
    233.         var form=new Ext.form.FormPanel({//start Ext.form.FormPanel
    234.             baseCls:'x-plain',
    235.             url:this.formSaveUrl,
    236.             frame:true,
    237.             id:'form',
    238.             items:formFields
    239.         });//end Ext.form.FormPanel
    240.         
    241.         return form;
    242.     },
    243.     /**
    244.      * 装form表单的窗口
    245.      * @param   form            要装载的form
    246.      * @param   titlePre        标题的前缀
    247.      */
    248.     formWindow:function(form,titlePre){
    249.         //实例化窗口
    250.         this.window=new Ext.Window({//start Ext.Window
    251.             title:titlePre+'任务列表',
    252.             500,
    253.             height:500,
    254.             minWidth:300,
    255.             minHeight:300,
    256.             layout:'fit',
    257.             //closeAction:'hide',
    258.             plain:true,
    259.             bodyStyle:'padding:5px',
    260.             iconCls:'form',
    261.             buttonAlign:'center',
    262.             items:form,
    263.             modal:true,
    264.             
    265.             buttons:[{                          //按钮
    266.                 text:'保存',
    267.                 handler:(function(){//start function按钮处理函数
    268.                     if(form.getForm().isValid()){//表单是否通过交验,通过责提交表单,否则弹出错误窗口
    269.                         form.getForm().submit({
    270.                             scope:this,
    271.                             waitMsg:'保存数据...',
    272.                             success:function(form,action){
    273.                                 Ext.MessageBox.alert('消息:','保存成功');
    274.                                 this.grid.store.reload();
    275.                                 this.window.close() ;
    276.                             },
    277.                             failure:function(form,action){
    278.                                 Ext.MessageBox.alert('有错误:', action.result.errors);
    279.                                 this.window.close() ;
    280.                             }
    281.                         });
    282.                     }else{
    283.                         Ext.MessageBox.alert('有错误:','表单填写由错误!');
    284.                     }
    285.                     
    286.                 }).createDelegate(this)//end function               
    287.             },{
    288.                 text:'重置',
    289.                 handler:function(){//start function按钮处理函数
    290.                     form.getForm().reset();
    291.                 }//end function 
    292.             }]
    293.         });//end Ext.Window

    294.         //显示窗口
    295.         this.window.show();
    296.     },
    297.     /**
    298.      * 添加列表新数据的函数
    299.      */
    300.     newInfo:function(){//start newTableInfo
    301.         this.formWindow(this.getForm(),'添加');       
    302.     },//end newTableInfo
    303.     /**
    304.      * 删除数据,并把此数据的唯一标识码发送到后台
    305.      */
    306.     handlerDelete:function(){//start deleteRecord
    307.         this.sendId(this.deleteUrl);
    308.         
    309.     },//end deleteRecord
    310.     sendId:function(url){//start deleteRecord
    311.         var ids=new Array();                //存放uniqueCode的数组
    312.         var records=this.grid.selModel.selections.items;//grid中被选择的数据,类型为Array
    313.         for(var i = 0, len = records.length; i < len; i++){
    314.             ids[ids.length]=records[i].id;  //把数据id赋予ids数组中
    315.         }
    316.         Ext.Ajax.request({                  //调用Ajax发送请求到后台
    317.             scope:this,
    318.             url:url,                    //删除grid数据的url.
    319.             success:function(transport){                //处理成功后返回的函数
    320.                 var oXmlDom=transport.responseText;
    321.                 if(oXmlDom!=''){
    322.                     
    323.                     var content=eval(oXmlDom);
    324.                     Ext.MessageBox.alert("有错误:",content.errors)
    325.                 }else{
    326.                     this.grid.store.reload();       //重新加载grid中的数据
    327.                 }
    328.             },
    329.             failure:function(){             //处理后台删除失败的函数
    330.                 Ext.MessageBox.alert('消息','删除失败!');
    331.             }
    332.         });
    333.         
    334.     },//end deleteRecord
    335.     exportExcel:function(){
    336.         document.location.href='http://localhost:8080/chalk/hf/sortManager.do?action=export';
    337.     }
    338. }

    下面是使用前要再加的 js ,主要是处理一些ext2.0一些效果,不加也可以,不过可能会少些效果

    1. //填充图片的本地应用
    2. Ext.BLANK_IMAGE_URL='../resources/images/default/s.gif';
    3. //在ie中默认的宽度不够
    4. Ext.apply(Ext.MessageBox,{
    5.     alert:function(title, msg, fn, scope){
    6.         this.show({
    7.             title : title,
    8.             msg : msg,
    9.             buttons: this.OK,
    10.             minWidth:200,
    11.             fn: fn,
    12.             scope : scope
    13.         });
    14.         return this;
    15.     }
    16. });
    17. Ext.menu.RangeMenu.prototype.icons = {
    18.       gt: '../resources/extendIamges/greater_then.png', 
    19.       lt: '../resources/extendIamges/less_then.png',
    20.       eq: '../resources/extendIamges/equals.png'
    21. };
    22. Ext.grid.filter.StringFilter.prototype.icon = '../resources/extendIamges/find.png';

    23. /* 
    24.  * 修改filter发送到后台的数据模式.
    25.  * 例:filter.[i][field]、filter.[i][type]、filter.[i][value]、filter.[i][comparison]、
    26.  * 
    27.  */

    28. Ext.grid.GridFilters.prototype.buildQuery=function(filters){
    29.     var p = {};
    30.         for(var i=0, len=filters.length; i<len; i++) {
    31.             var f = filters[i];
    32.             var root = [this.paramPrefix, '[', i, ']'].join('');
    33.             p[root + '[field]'] = f.field;
    34.             //修改此处
    35.             var dataPrefix = root;
    36.             for(var key in f.data) {
    37.                 p[[dataPrefix, '[', key, ']'].join('')] = f.data[key];
    38.       }
    39.         }
    40.         
    41.     return p;
    42. }

    43. //添加时间交验函数
    44. Ext.apply(Ext.form.VTypes, {    
    45.     //时间交验属性
    46.     daterange: function(val, field) {
    47.         var date = field.parseDate(val);
    48.         
    49.         var dispUpd = function(picker) {
    50.           var ad = picker.activeDate;
    51.           picker.activeDate = null;
    52.           picker.update(ad);
    53.         };

    54.         //debugger;
    55.         if (field.startDateField) {
    56.           var sd = field.startDateField;
    57.           sd.maxValue = date;
    58.           if (sd.menu && sd.menu.picker) {
    59.             sd.menu.picker.maxDate = date;
    60.             dispUpd(sd.menu.picker);
    61.           }
    62.         } else if (field.endDateField) {
    63.           var ed = field.endDateField;
    64.           ed.minValue = date;
    65.           if (ed.menu && ed.menu.picker) {
    66.             ed.menu.picker.minDate = date;
    67.             dispUpd(ed.menu.picker);
    68.           }
    69.         }

    70.         return true;
    71.   }
    72. });
    73. Ext.QuickTips.init();

    此代码中可能会用到之前的radio和checkbox校代码

    这里也随便贴出来

    1. /**
    2.  * 此js为补充Extjs的chechbox和radio校验
    3.  * 
    4.  * checkbox需要添加属性:
    5.  * showInvalidText:Boolean 
    6.  * 此属性为标识出在那个checkbox后面添加错误图片
    7.  * 注意:boxLabel需要两个字符不然图片会合字重叠,可以在字符后加一空格' '
    8.  * 
    9.  * radio需要添加属性:
    10.  * showInvalidText:Boolean 
    11.  * 此属性为标识出在那个radio后面添加错误图片
    12.  */

    13. Ext.apply(Ext.form.Checkbox.prototype, {
    14.     getErrorCt:function(){
    15.         return this.el.findParent('.x-form-element', 5, true) || // use form element wrap if available
    16.             this.el.findParent('.x-form-field-wrap', 5, true);   // else direct field wrap
    17.     }
    18. });

    19. Ext.apply(Ext.form.Radio.prototype, {
    20.     getErrorCt:function(){
    21.         return this.el.findParent('.x-form-element', 5, true) || // use form element wrap if available
    22.             this.el.findParent('.x-form-field-wrap', 5, true);   // else direct field wrap
    23.     }
    24. });

    25. function markInvalid(msg){
    26.     if (!this.rendered || this.preventMark) { // not rendered
    27.         return;
    28.     }
    29.     this.el.addClass(this.invalidClass);
    30.     msg = msg || this.invalidText;
    31.     switch (this.msgTarget) {
    32.         case 'qtip' :
    33.             this.el.dom.qtip = msg;
    34.             this.el.dom.qclass = 'x-form-invalid-tip';
    35.             if (Ext.QuickTips) { // fix for floating editors interacting with
    36.                                     // DND
    37.                 Ext.QuickTips.enable();
    38.             }
    39.             break;
    40.         case 'title' :
    41.             this.el.dom.title = msg;
    42.             break;
    43.         case 'under' :
    44.             if (!this.errorEl) {
    45.                 var elp = this.getErrorCt();
    46.                 this.errorEl = elp.createChild( {
    47.                     cls : 'x-form-invalid-msg'
    48.                 });
    49.                 this.errorEl.setWidth(elp.getWidth(true) - 20);
    50.             }
    51.             this.errorEl.update(msg);
    52.             Ext.form.Field.msgFx[this.msgFx].show(this.errorEl, this);
    53.             break;
    54.         case 'side' :
    55.             if (!this.showInvalidText) {
    56.                 break;
    57.             }

    58.             if (!this.errorIcon) {
    59.                 var elp = this.getErrorCt();
    60.                 this.errorIcon = elp.createChild( {
    61.                     cls : 'x-form-invalid-icon'
    62.                 });
    63.             }
    64.             this.errorIcon.alignTo(this.el.next(), 'tl-tr', [2, 0]);
    65.             this.errorIcon.dom.qtip = msg;
    66.             this.errorIcon.dom.qclass = 'x-form-invalid-tip';
    67.             this.errorIcon.show();
    68.             this.on('resize', this.alignErrorIcon, this);
    69.             break;
    70.         default :
    71.             var t = Ext.getDom(this.msgTarget);
    72.             t.innerHTML = msg;
    73.             t.style.display = this.msgDisplay;
    74.             break;
    75.     }
    76.     this.fireEvent('invalid', this, msg);
    77. }

    78. function clearInvalid(){
    79.     if (!this.rendered || this.preventMark) { // not rendered
    80.         return;
    81.     }
    82.     this.el.removeClass(this.invalidClass);
    83.     switch (this.msgTarget) {
    84.         case 'qtip' :
    85.             this.el.dom.qtip = '';
    86.             break;
    87.         case 'title' :
    88.             this.el.dom.title = '';
    89.             break;
    90.         case 'under' :
    91.             if (this.errorEl) {
    92.                 Ext.form.Field.msgFx[this.msgFx].hide(this.errorEl, this);
    93.             }
    94.             break;
    95.         case 'side' :
    96.             if (this.errorIcon) {
    97.                 this.errorIcon.dom.qtip = '';
    98.                 this.errorIcon.hide();
    99.                 this.un('resize', this.alignErrorIcon, this);
    100.             }
    101.             break;
    102.         default :
    103.             var t = Ext.getDom(this.msgTarget);
    104.             t.innerHTML = '';
    105.             t.style.display = 'none';
    106.             break;
    107.     }
    108.     this.fireEvent('valid', this);
    109. }

    110. function validate(){
    111.     var array = this.ownerCt.find('name', this.name);
    112.     if (this.validateValue(this.processValue(this.getRawValue()))) {
    113.         for(var i=0;i<array.length;i++){
    114.             array[i].clearInvalid();
    115.         }
    116.         return true;
    117.     }
    118.     return false;
    119. }

    120. function validateValue() {
    121.     if (!this.getGroupValue()) {
    122.         this.markInvalid();
    123.         return false;
    124.     }
    125.     return true;
    126. }

    127. Ext.form.Checkbox.prototype.markInvalid=Ext.form.Radio.prototype.markInvalid = markInvalid;

    128. Ext.form.Checkbox.prototype.clearInvalid=Ext.form.Radio.prototype.clearInvalid = clearInvalid;

    129. Ext.form.Checkbox.prototype.validate=Ext.form.Radio.prototype.validate = validate;

    130. Ext.form.Checkbox.prototype.validateValue=function(){
    131.     var array = this.ownerCt.find('name', this.name);
    132.     
    133.     for(var i=0;i<array.length;i++){
    134.         if(array[i].getValue()){
    135.             return true;
    136.         }
    137.     }
    138.     this.markInvalid();
    139.     return false;
    140. }

    141. Ext.form.Radio.prototype.validateValue = validateValue;
  • 相关阅读:
    Creat-React-Native-App 之StackNavigator之踩坑记录
    [转]JavaScript构造函数及原型对象
    js技巧之与或运算符 || && 妙用
    iOS 开发中的小技巧
    钥匙串中所有证书都失效的解决方法
    提高app性能
    jspatch
    谓词
    Xcode 添加 模版-
    IOS-Jenkins 自动打包
  • 原文地址:https://www.cnblogs.com/winner/p/1273770.html
Copyright © 2011-2022 走看看