`
dyyaries
  • 浏览: 80733 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Extjs3.2自定义组件的书写

    博客分类:
  • Web
阅读更多

最近参与的项目中用到Extjs,研究了几天, 发现实际开发中很有必要将各种布局的组件一起作为自定义组件使用,以提高代码重用性。

项目中的‘添加用户’功能中, 由于用户信息比较多,还同时可能要注册其账号信息,所以想在添加的时候分多步填写最后提交。

翻阅Extjs3.2的example发现没有满足要求的组件。于是试着书写一个。我暂时给它取名叫StepForm。

 

1.Extjs中可以模拟java中的集成关系,从而可以让自定义的‘类’集成自Extjs中的‘类’,比如Ext.Panel,Ext.Window等等。

于是,要做的第一步就是新建一个StemForm.js文件,然后用Ext.extend(Ext.Panel,{})集成Ext中的Panel。

 

  1. Ext.ns("Util");  
  2. Util.StepForm = Ext.extend(Ext.Panel,{  
  3.     //重写构造函数,conf为自定义的参数   
  4.     constructor:function(conf){},  
  5.   
  6.    //自定义函数   
  7.     register:function(){}  
  8.   
  9. ))  

 

 

2.重写Panel的构造函数constructor,在该函数中书写Util.StepForm.superclass.constructor.apply(this,[{...}])来提交自定义的参数。

 

  1. constructor:function(conf){  
  2.         var items = conf.items;  //点击左边连接可以切换的不同的表单,   
  3.     var number = conf.number; //列表是否显示数字   
  4.     //...   
  5.   
  6.          //若干操作   
  7.          Util.StepForm.superclass.constructor.apply(  
  8.          this,[{  
  9.                 //这里开始就是你要自定义的布局或者元素了,因为该类本身继承自Ext.Panel,所以它也可以添加跟多子组件并布局。   
  10.         width:conf.width,  
  11.         height:conf.height,  
  12.         layout:'border',  
  13.         items:[  
  14.                          
  15.             new Ext.Panel({  
  16.                 id:'nav',  
  17.                 title:ltitle,  
  18.                 region:'west',  
  19.                 width:navWidth,  
  20.                 html:link  
  21.             }),  
  22.             //...省略   
  23.         ]  
  24.         }]  
  25.         );  
  26.           
  27.         //若干操作省略   
  28. }  

 

 

3.当自定义StepForm类写好后,可以与使用Ext本身组件一样的方式使用 var stepForm = new Util.StepForm({});

 

最后我把完整代码输出:

StepForm.js:

 

  1. Ext.ns("Util");  
  2. Util.StepForm = Ext.extend(Ext.Panel,{  
  3.     constructor:function(conf){  
  4.         var items = conf.items;  //点击左边连接可以切换的不同的表单,   
  5.         var number = conf.number; //列表是否显示数字   
  6.         var activeTab = conf.activeTab;    //加载时的默认活动标签   
  7.         var ltitle = conf.ltitle;   //z左边标题   
  8.         var rtitle = conf.rtitle;   //右边标题   
  9.         var navWidth = conf.navWidth; //导航栏的宽度   
  10.         var count = activeTab;  //记录当前活动项的索引   
  11.         if(activeTab>items.length-1) {  
  12.             alert("activeTab值大于items的数量");  
  13.             return;  
  14.         }  
  15.         var link = "";     //显示在左边的列表html内容   
  16.         var bodys = new Array();  
  17.         for(var i=0; i<items.length; i++){  
  18.             var item = items[i];  
  19.             if(number){  
  20.                 if(activeTab == i){  
  21.                     link += "<a id='alink"+i+"' href="javascript:void(0)" mce_href="javascript:void(0)" style="display:block;cursor:pointer;padding:5px 10px;text-decoration:none;font-size:14px;font-weight:bold" mce_style="display:block;cursor:pointer;padding:5px 10px;text-decoration:none;font-size:14px;font-weight:bold">"+(i+1)+"."+item.title+"</a><br/>";  
  22.                 }else{  
  23.                     link += "<a id='alink"+i+"' href="javascript:void(0)" mce_href="javascript:void(0)" style="display:block;cursor:pointer;padding:5px 10px;text-decoration:none;font-size:12px" mce_style="display:block;cursor:pointer;padding:5px 10px;text-decoration:none;font-size:12px">"+(i+1)+"."+item.title+"</a><br/>";  
  24.                 }  
  25.             }else{  
  26.                 if(activeTab == i){  
  27.                     link += "<a id='alink"+i+"' href="javascript:void(0)" mce_href="javascript:void(0)" style="display:block;cursor:pointer;padding:5px 10px;text-decoration:none;font-size:14px;font-weight:bold" mce_style="display:block;cursor:pointer;padding:5px 10px;text-decoration:none;font-size:14px;font-weight:bold">"+item.title+"</a><br/>";  
  28.                 }else{  
  29.                     link += "<a id='alink"+i+"' href="javascript:void(0)" mce_href="javascript:void(0)" style="display:block;cursor:pointer;padding:5px 10px;text-decoration:none;font-size:12px" mce_style="display:block;cursor:pointer;padding:5px 10px;text-decoration:none;font-size:12px">"+item.title+"</a><br/>";  
  30.                 }  
  31.             }  
  32.             //将表单收集到bodys数组   
  33.             var forms = item.items;  
  34.             if(!forms){  
  35.                 alert("缺少items属性");  
  36.                 return;  
  37.             }  
  38.             var form = item.items[0];  
  39.             form.id = "form"+i;  
  40.             if(activeTab != i){  
  41.                 form.hidden = true;  
  42.             }else{  
  43.                 form.hidden = false;  
  44.             }  
  45.             bodys.push(form);  
  46.         }  
  47.           
  48.         Util.StepForm.superclass.constructor.apply(  
  49.             this,[{  
  50.                 width:conf.width,  
  51.                 height:conf.height,  
  52.                 layout:'border',  
  53.                 items:[  
  54.                     new Ext.Panel({  
  55.                         id:'nav',  
  56.                         title:ltitle,  
  57.                         region:'west',  
  58.                         width:navWidth,  
  59.                         html:link  
  60.                     }),  
  61.                     new Ext.Panel({  
  62.                         title:rtitle,  
  63.                         height:conf.height,  
  64.                         layout:'fit',  
  65.                         region:'center',  
  66.                         items:bodys  
  67.                     }),  
  68.                     new Ext.Panel({  
  69.                         autoHeight:true,  
  70.                         region:'south',  
  71.                         bbar:new Ext.Toolbar([  
  72.                             {xtype:'tbfill'},  
  73.                             {xtype:'button',id:'prev',text:'上一步',handler:function(){  
  74.                                 navFun(count-1);  
  75.                             }},  
  76.                             {xtype:'button',id:'next',text:'下一步',handler:function(){  
  77.                                 navFun(count+1);  
  78.                             }}  
  79.                         ])  
  80.                     })  
  81.                 ]  
  82.             }]  
  83.         );  
  84.         var navFun = function(index){  
  85.             if(index < 0) {  
  86.                 index = 0;  
  87.                 count = 0;  
  88.             }  
  89.             if(index > bodys.length-1){  
  90.                 index = bodys.length - 1;  
  91.                 count = bodys.length - 1;  
  92.             }  
  93.             for(var i=0; i<bodys.length; i++){  
  94.                 if(i == index){  
  95.                     Ext.getCmp("form"+i).show(true);  
  96.                     Ext.get("alink"+i).dom.style.fontSize = "14px";  
  97.                     Ext.get("alink"+i).dom.style.fontWeight = "bold";  
  98.                 }else{  
  99.                     Ext.getCmp("form"+i).hide(true);  
  100.                     Ext.get("alink"+i).dom.style.fontSize = "12px";  
  101.                     Ext.get("alink"+i).dom.style.fontWeight = "normal";  
  102.                 }  
  103.             }  
  104.             count = index;  
  105.         };  
  106.         this.bodys = bodys;  
  107.         this.activeTab = activeTab;  
  108.         this.navigate = navFun;  
  109.     },  
  110.     register:function(){  
  111.         var activeItem = Ext.get("alink"+this.activeTab).dom.innerHTML;  
  112.         var delegate = this.navigate;  
  113.         //给左边导航添加单击事件   
  114.         for(var i=0; i<this.bodys.length; i++){  
  115.             Ext.get("alink"+i).on("click",function(e){  
  116.                 var i = e.target.id.substring(5);  
  117.                 delegate(i);  
  118.             });  
  119.         }  
  120.           
  121.     }  
  122. });  
  123. Ext.reg('stepform', Util.StepForm);  

 

 

index.jsp

 

  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
  2. <html>  
  3.   <head>  
  4.     <base href="<%=basePath%>">  
  5.     <title>My JSP 'index.jsp' starting page</title>  
  6.     <meta http-equiv="pragma" content="no-cache">  
  7.     <meta http-equiv="cache-control" content="no-cache">  
  8.     <meta http-equiv="expires" content="0">      
  9.     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  
  10.     <meta http-equiv="description" content="This is my page">  
  11.     <link rel="stylesheet" type="text/css" href="js/extjs/resources/css/ext-all.css" mce_href="js/extjs/resources/css/ext-all.css" />  
  12.     <mce:script src="js/extjs/adapter/ext/ext-base.js" mce_src="js/extjs/adapter/ext/ext-base.js"></mce:script>  
  13.     <mce:script src="js/extjs/ext-all-debug.js" mce_src="js/extjs/ext-all-debug.js"></mce:script>  
  14.     <mce:script src="js/StepForm.js" mce_src="js/StepForm.js"></mce:script>  
  15.     <mce:script type="text/javascript"><!--  
  16.         if (Ext.BLANK_IMAGE_URL.substr(05) != 'data:') {  
  17.             Ext.BLANK_IMAGE_URL = 'js/extjs/resources/images/default/s.gif';  
  18.         }  
  19.         Ext.onReady(function(){  
  20.             var stepForm = new Util.StepForm({  
  21.                         width:500,  
  22.                         height:300,  
  23.                         navWidth:130,  
  24.                         number:true,  
  25.                         activeTab:3,  
  26.                         ltitle:'步骤',  
  27.                         rtitle:'用户信息',  
  28.                         items:[  
  29.                                 {  
  30.                                     title:'基本信息',  
  31.                                     items:[{  
  32.                                         xtype:'form',  
  33.                                         bodyStyle:'padding:20px',  
  34.                                         items:[  
  35.                                             {xtype:'textfield',fieldLabel:'姓名'},  
  36.                                             {xtype:'textfield',fieldLabel:'电子邮件'},  
  37.                                             {xtype:'textfield',fieldLabel:'电话'}  
  38.                                         ]  
  39.                                     }]    
  40.                                 },  
  41.                                 {  
  42.                                     title:'详细信息',  
  43.                                     items:[{  
  44.                                         xtype:'form',  
  45.                                         bodyStyle:'padding:20px',  
  46.                                         items:[  
  47.                                             {xtype:'textfield',fieldLabel:'牛逼'},  
  48.                                             {xtype:'textfield',fieldLabel:'牛逼'},  
  49.                                             {xtype:'textfield',fieldLabel:'牛逼'}  
  50.                                         ]  
  51.                                     }]  
  52.                                 }  
  53.                         ]  
  54.                     });  
  55.                       
  56.             var win = new Ext.Window({  
  57.                 title:'用户添加',  
  58.                 width:500,  
  59.                 height:300,  
  60.                 items:[  
  61.                     stepForm  
  62.                 ]  
  63.             });  
  64.             win.show(Ext.getBody());  
  65.             stepForm.register();  
  66.         });  
  67.       
  68. // --></mce:script>   
  69.   </head>  
  70.     
  71.   <body>  
  72.   </body>  
  73. </html>  

 

 

效果图:

 

分享到:
评论

相关推荐

    extjs3.2资源压缩包

    同时,ExtJS提供了强大的API,允许开发者自定义组件或者扩展已有组件,以满足特定需求。 6. **皮肤系统**:ExtJS 3.2支持多皮肤,开发者可以通过更换皮肤来改变应用的视觉风格,适应不同的品牌和设计需求。 7. **...

    ExtJs3.2官方原版

    这个“ExtJs3.2官方原版”是该库的一个早期版本,提供了一整套用于创建动态、交互式用户界面的工具和组件。在ExtJs3.2中,开发者可以利用其丰富的组件库、数据绑定机制以及强大的布局管理来构建复杂且高性能的Web...

    ExtJS3.2正式版

    ExtJS3.2正式版 货真价实 ExtJS3.2正式版

    Extjs3.2中文帮助手册

    这个"Extjs3.2中文帮助手册"是开发人员在使用ExtJS 3.2时的重要参考资料,它包含了详细的API文档、示例代码和使用指南,使得开发者能够更方便地理解和应用这个框架。 手册中的知识点主要包括以下几个方面: 1. **...

    extjs3.2api中文

    "extjs3.2api中文"标题表明这是一个中文版的ExtJS 3.2 API文档,对于中文开发者来说,能够更方便地理解和使用这个框架。 "BLANK_IMAGE_URL"是ExtJS中的一个常量,它通常被用作一个占位符图像的URL。这个1×1像素的...

    ExtJs3.2+中文API

    ExtJs3.2+中文API 便于开发查找API 很方便

    ExtJS如何自定义图片按钮组件

    1.ExtJS自定义组件,图片按钮为例. 2.此图片按钮背景完全为图片,没有边框,需要使用者提供2张图片,一张初始化用,一张点击后用,可在'imgPaths:'属性里填写,格式为'01.jpg~02.jpg' 3.解压后请将所有附件放置您extjs...

    ExtJS3.2列布局

    "ExtJS3.2列布局"是这个框架中的一个重要概念,尤其在处理form表单时非常实用。 列布局(Column Layout)是ExtJS的一种布局策略,它允许你在同一行内创建多个并排显示的区域,每个区域可以包含不同的组件,如文本框...

    安装Extjs的插件spket,extjs3.2版.doc

    ExtJS 3.2通常包含一个名为`ext.jsb`的文件,这个文件是Spket识别ExtJS库的关键。接下来,按照以下步骤安装Spket插件: 1. **以Eclipse插件形式安装**: - 打开Eclipse,通过菜单栏依次选择`Help` -&gt; `Software ...

    ExtJS 3.2 聊天室程序(类Q_Q群)

    ExtJS 3.2 聊天室程序(类Q_Q群)

    EXTJS3.2-3.3中文API和包

    通过查看源码,开发者可以深入理解EXTJS的工作原理,自定义组件,或者优化性能。源码中包含了各种组件的实现,如Window、Panel、Toolbar等,还有布局管理器、数据包、Ajax请求等核心模块。 EXTJS 3.x版本的主要知识...

    ExtJs 3.2 中文API帮助文档

    ExtJS是一种主要用于创建前端用户界面,是一个与后台技术无关的前端ajax框架。功能丰富,无人能出其右。无论是界面之美,还是功能之强,ext的表格控件都... ExtJs 3.2 中文API帮助文档,CHM离线的,希望对大家有帮助

    extjs3.2 中文API 完整版

    网络上流传很多exjs 中文API,都神马东西,下载都没用。现在鄙人从脚本娃娃群分享的完整API上传分享给大家!

    ExtJS3.2的各种例子

    我收集了各种ExtJS的例子,有3.2还有2.5,还有所有“掏钱学ExtJS”的例子,绝对物超所值。

    ExtJS3.2中文API与示例

    Ext3.2中文API及代码示例,经典的API翻译,丰富的代码示例 就在这里等着你下!

    extjs3.2+struts2实现多文件上传excel并插入到数据库

    本项目“extjs3.2+struts2实现多文件上传excel并插入到数据库”是针对这一需求的具体解决方案,利用了ExtJS 3.2前端框架和Struts2后端框架进行开发。 **ExtJS 3.2** 是一个基于JavaScript的富客户端应用框架,提供...

    Eclipse安装Extjs3.2的spket插件(附插件和Ext文件)

    在本文中,我们将详细介绍如何在Eclipse环境中安装适用于ExtJS 3.2的Spket插件,以便于JavaScript开发和代码提示。首先,让我们了解一下Eclipse、ExtJS和Spket这三个关键概念。 Eclipse是一款开源的集成开发环境...

    ExtJS3.2资源包

    ExtJs3.2的资源包,需要的朋友可以下载

    extjs最新版 3.2版本

    - `resources` 文件夹:存储CSS样式、图片和其他资源文件,用于自定义EXTJS组件的外观。 - `docs` 文件夹:可能包含了EXTJS的API文档,供开发者参考。 - `build` 文件夹:可能包含编译后的版本,适合生产环境使用。 ...

Global site tag (gtag.js) - Google Analytics