`
Fangrn
  • 浏览: 818074 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

extjs3支持按步骤处理(向导)控件

阅读更多

有些业务处理我们不能一步做完,所以我们希望实现一个类似于setup安装向导的控件,在ext官方的论坛上找到一个,但是只支持extjs2.×,下边的这个控件是在extjs3.×上做的

Ext.layout.UXCardLayout=Ext.extend(Ext.layout.CardLayout,{setActiveItem:function(item){
    item=this.container.getComponent(item);
    if(this.activeItem!=item){
      if(this.activeItem){
        this.activeItem.hide();
      }
      if(this.activeItem&&!this.activeItem.hidden){
        return ;
      }
      this.activeItem=item;
      item.show();
      this.layout();
    }
  }});
Ext.UXWizHeader=Ext.extend(Ext.BoxComponent,{height:55,region:"north",title:"Wizard",steps:0,stepText:"Step {0} of {1}: {2}",autoEl:{tag:"div",cls:"ext-ux-wiz-Header",children:[{tag:"div",cls:"ext-ux-wiz-Header-title"},{tag:"div",children:[{tag:"div",cls:"ext-ux-wiz-Header-step"},{tag:"div",cls:"ext-ux-wiz-Header-stepIndicator-container"}]}]},titleEl:null,stepEl:null,imageContainer:null,indicators:null,stepTemplate:null,lastActiveStep:-1,updateStep:function(currentStep,title){
    var html=this.stepTemplate.apply({0:currentStep+1,1:this.steps,2:title});
    this.stepEl.update(html);
    if(this.lastActiveStep!=-1){
      this.indicators[this.lastActiveStep].removeClass("ext-ux-wiz-Header-stepIndicator-active");
    }
    this.indicators[currentStep].addClass("ext-ux-wiz-Header-stepIndicator-active");
    this.lastActiveStep=currentStep;
  },onRender:function(ct,position){
    Ext.UXWizHeader.superclass.onRender.call(this,ct,position);
    this.indicators=[];
    this.stepTemplate=new Ext.Template(this.stepText),this.stepTemplate.compile();
    var el=this.el.dom.firstChild;
    var ns=el.nextSibling;
    this.titleEl=new Ext.Element(el);
    this.stepEl=new Ext.Element(ns.firstChild);
    this.imageContainer=new Ext.Element(ns.lastChild);
    this.titleEl.update(this.title);
    var image=null;
    for(var i=0,len=this.steps;i<len;i++){
      image=document.createElement("div");
      image.innerHTML="&#160;";
      image.className="ext-ux-wiz-Header-stepIndicator";
      this.indicators[i]=new Ext.Element(image);
      this.imageContainer.appendChild(image);
    }
  }});
Ext.UXWiz=Ext.extend(Ext.Window,{loadMaskConfig:{"default":"Saving..."},height:400,width:540,closable:true,resizable:false,modal:true,cards:null,previousButtonText:"&lt; Previous",nextButtonText:"Next &gt;",cancelButtonText:"Cancel",finishButtonText:"Finish",headerConfig:{},cardPanelConfig:{},previousButton:null,nextButton:null,cancelButton:null,cardPanel:null,currentCard:-1,headPanel:null,cardCount:0,initComponent:function(){
    this.initButtons();
    this.initPanels();
    var title=this.title||this.headerConfig.title;
    title=title||"";
    Ext.apply(this,{title:title,layout:"border",cardCount:this.cards.length,buttons:[this.previousButton,this.nextButton,this.cancelButton],items:[this.headPanel,this.cardPanel]});
    this.addEvents("cancel","finish");
    Ext.UXWiz.superclass.initComponent.call(this);
    this.cardPanel.activeItem=0;
  },getWizardData:function(){
    var formValues={};
    var cards=this.cards;
    for(var i=0,len=cards.length;i<len;i++){
      if(cards[i].form){
        formValues[cards[i].id]=cards[i].form.getValues(false);
      }else {
        formValues[cards[i].id]={};
      }
    }
    return formValues;
  },switchDialogState:function(enabled,type){
    this.showLoadMask(!enabled,type);
    this.previousButton.setDisabled(!enabled);
    this.nextButton.setDisabled(!enabled);
    this.cancelButton.setDisabled(true);
    if(this.closable){
      var ct=this.tools["close"];
      switch(enabled){
      case true:
        this.tools["close"].unmask();
        break ;
      default:
        this.tools["close"].mask();
        break ;
      }
    }
  },showLoadMask:function(show,type){
    if(!type){
      type="default";
    }
    if(show){
      if(this.loadMask==null){
        this.loadMask=new Ext.LoadMask(this.body);
      }
      this.loadMask.msg=this.loadMaskConfig["type"];
      this.loadMask.show();
    }else {
      if(this.loadMask){
        this.loadMask.hide();
      }
    }
  },initPanelsEvents:function(){
    var cards=this.cards;
    for(var i=0,len=cards.length;i<len;i++){
      cards[i].on("show",this.onCardShow,this);
      cards[i].on("hide",this.onCardHide,this);
      cards[i].on("clientvalidation",this.onClientValidation,this);
    }
  },initPanels:function(){
    var cards=this.cards;
    var cardPanelConfig=this.cardPanelConfig;
    Ext.apply(this.headerConfig,{steps:cards.length});
    this.headPanel=new Ext.UXWizHeader(this.headerConfig);
    Ext.apply(cardPanelConfig,{layout:new Ext.layout.UXCardLayout(),items:cards});
    this.initPanelsEvents();
    Ext.applyIf(cardPanelConfig,{region:"center",border:false,activeItem:0});
    this.cardPanel=new Ext.Panel(cardPanelConfig);
  },initButtons:function(){
    this.previousButton=new Ext.Button({text:this.previousButtonText,disabled:true,minWidth:75,handler:this.onPreviousClick,scope:this});
    this.nextButton=new Ext.Button({text:this.nextButtonText,minWidth:75,handler:this.onNextClick,scope:this});
    this.cancelButton=new Ext.Button({text:this.cancelButtonText,handler:this.onCancelClick,scope:this,minWidth:75});
  },onClientValidation:function(card,isValid){
    if(!isValid){
      this.nextButton.setDisabled(true);
    }else {
      this.nextButton.setDisabled(false);
    }
  },onCardHide:function(card){
    if(this.cardPanel.layout.activeItem.id===card.id){
      this.nextButton.setDisabled(true);
    }
  },onCardShow:function(card){
    var parent=card.ownerCt;
    var items=parent.items;
    for(var i=0,len=items.length;i<len;i++){
      if(items.get(i).id==card.id){
        break ;
      }
    }
    this.currentCard=i;
    this.headPanel.updateStep(i,card.title);
    if(i==len-1){
      this.nextButton.setText(this.finishButtonText);
    }else {
      this.nextButton.setText(this.nextButtonText);
    }
    if(card.isValid()){
      this.nextButton.setDisabled(false);
    }
    if(i==0){
      this.previousButton.setDisabled(true);
    }else {
      this.previousButton.setDisabled(false);
    }
  },onCancelClick:function(){
    if(this.fireEvent("cancel",this)!==false){
      this.close();
    }
  },onFinish:function(){
    if(this.fireEvent("finish",this,this.getWizardData())!==false){
      this.close();
    }
  },onPreviousClick:function(){
    if(this.currentCard>0){
      this.cardPanel.getLayout().setActiveItem(this.currentCard-1);
    }
  },onNextClick:function(){
    if(this.currentCard==this.cardCount-1){
      this.onFinish();
    }else {
      this.cardPanel.getLayout().setActiveItem(this.currentCard+1);
    }
  }});
Ext.UXWizCard=Ext.extend(Ext.FormPanel,{header:false,hideMode:"display",initComponent:function(){
    this.addEvents("beforecardhide");
    Ext.UXWizCard.superclass.initComponent.call(this);
  },isValid:function(){
    if(this.monitorValid){
      return this.bindHandler();
    }
    return true;
  },bindHandler:function(){
    var valid=true;
    this.form.items.each(function(f){
      if(f.isValid&&!f.isValid(true)){
        valid=false;
        return false;
      }
    });
    if(this.buttons){
      for(var i=0,len=this.buttons.length;i<len;i++){
        var btn=this.buttons[i];
        if(btn.formBind===true&&btn.disabled===valid){
          btn.setDisabled(!valid);
        }
      }
    }
    this.fireEvent("clientvalidation",this,valid);
  },initEvents:function(){
    var old=this.monitorValid;
    this.monitorValid=false;
    Ext.UXWizCard.superclass.initEvents.call(this);
    this.monitorValid=old;
    this.on("beforehide",this.bubbleBeforeHideEvent,this);
    this.on("beforecardhide",this.isValid,this);
    this.on("show",this.onCardShow,this);
    this.on("hide",this.onCardHide,this);
  },bubbleBeforeHideEvent:function(){
    var ly=this.ownerCt.layout;
    var activeItem=ly.activeItem;
    if(activeItem&&activeItem.id===this.id){
      return this.fireEvent("beforecardhide",this);
    }
    return true;
  },onCardHide:function(){
    if(this.monitorValid){
      this.stopMonitoring();
    }
  },onCardShow:function(){
    if(this.monitorValid){
      this.startMonitoring();
    }
  }});

 使用方法:

var wizard=new Ext.UXWiz({title:"\u5408\u5e76\u673a\u6784",headerConfig:{title:"\u673a\u6784\u5408\u5e76"},cardPanelConfig:{defaults:{baseCls:"x-small-editor",bodyStyle:"padding:40px 15px 5px 20px;background-color:#F6F6F6;",border:false}},cards:[new Ext.UXWizCard({title:"Welcome",items:[{border:false,bodyStyle:"background:none;",html:"\u673a\u6784\u5408\u5e76\uff0c\u9009\u62e9\u9700\u8981\u5408\u5e76\u7684\u673a\u6784\uff0c\u786e\u5b9a\u5408\u5e76\u540e\u7684\u76ee\u6807\u673a\u6784\uff0c\u4fdd\u5b58\u540e\u5408\u5e76\u524d\u7684\u673a\u6784\u5c06\u88ab\u5220\u9664\uff0c\u5176\u4eba\u5458\u4fe1\u606f\u5c06\u8f6c\u79fb\u5230\u65b0\u673a\u6784\u3002"}]}),new Ext.UXWizCard({title:"Your name",monitorValid:true,defaults:{labelStyle:"font-size:11px"},items:[{border:false,bodyStyle:"background:none;padding-bottom:30px;",html:"Please enter your first- and your lastname. Only letters, underscores and hyphens are allowed."},new Ext.form.TextField({name:"firstname",fieldLabel:"Firstname",allowBlank:false,validator:function(v){
        var t=/^[a-zA-Z_\- ]+$/;
        return t.test(v);
      }}),new Ext.form.TextField({name:"lastname",fieldLabel:"Lastname",allowBlank:false,validator:function(v){
        var t=/^[a-zA-Z_\- ]+$/;
        return t.test(v);
      }})]}),new Ext.UXWizCard({title:"Your email-address",monitorValid:true,defaults:{labelStyle:"font-size:11px"},items:[{border:false,bodyStyle:"background:none;padding-bottom:30px;",html:" Please enter your email-address."},new Ext.form.TextField({name:"email",fieldLabel:"Email-Address",allowBlank:false,vtype:"email"})]}),new Ext.UXWizCard({title:"Finished!",monitorValid:true,items:[{border:false,bodyStyle:"background:none;",html:"Thank you for testing this wizard. Your data has been collected "+"and can be accessed via a call to <pre><code>this.getWizardData</code></pre>"+"When you click on the \"finish\"-button, the \"finish\"-event will be fired.<br/>"+"If no attached listener for this event returns \"false\", this dialog will be "+"closed. <br />"}]})]});
wizard.on("finish",function(t,d){
  alert(Ext.encode(d));
  return false;
},wizard);
wizard.show();

 测试效果图:



 官方网站:

http://www.siteartwork.de/wizardcomponent

  • 大小: 31.7 KB
分享到:
评论
1 楼 downing114 2011-04-17  
我使用wizard.hide(); 然后再wizard.show();就不行了,js报错:
‘dom.style’为空或不是对象
ext-all-debug.js 第7000行

相关推荐

    extjs3.2、3.3 时间控件 日期控件扩展

    - 日期控件支持多种日期格式,如'YYYY-MM-DD'、'MM/DD/YYYY'等,可通过`format`属性设置。 - 用户可以设置日期选择范围,如最小日期和最大日期,以及是否开启日期验证。 - 示例代码:`var dateField = new Ext....

    ExtJs图片按钮控件

    ExtJs图片按钮控件是ExtJs框架中一种增强的按钮组件,它允许开发者在按钮上显示图片,以提供更丰富的用户界面。这个控件通常用于创建具有视觉吸引力的交互式UI元素,比如导航按钮或者操作按钮。下面我们将深入探讨...

    extjs 微调控件,时间微调控件,微调,javascript 微调

    6. **国际化支持**:ExtJS支持多语言,微调控件也可以根据用户设置的语言环境显示相应的提示信息。 7. **无障碍性**:确保微调控件遵循无障碍设计原则,如提供键盘导航支持和适当的ARIA属性。 理解并掌握这些知识...

    extjs时间控件精确秒

    在EXTJS这个强大的JavaScript框架中,时间控件是开发者经常使用的组件之一,尤其在构建复杂的Web应用程序时。EXTJS的时间控件允许用户选择或输入时间,通常以小时、分钟和秒为单位,提供了用户友好的界面和丰富的...

    extjs3.0 日期时间控件

    3. **事件处理**:可以监听`select`事件,当用户选择日期和时间后触发,进行后续处理,如保存数据。 4. **自定义样式**:可以通过CSS对DateTimeField的外观进行调整,例如更改背景色、字体大小等。 5. **国际化...

    extjs日期+时间控件

    5. **事件处理**:ExtJS控件通常支持多种事件,如`select`事件(当用户选择一个日期或时间时触发),开发者可以绑定回调函数来响应这些事件,进行进一步的数据处理或验证。 6. **本地化**:对于国际化的应用,日期...

    Extjs与C#完美接合写法控件源代码

    - ExtJS 的组件可按需加载,提高页面性能。C#后端可提供分页、过滤和排序等功能,以适应动态加载的数据需求。 10. **调试和测试**: - 开发过程中,使用Visual Studio进行C#代码的调试,同时利用浏览器的开发者...

    extjs年份控件(只显示年,无月日时分秒)

    Extjs DateField控件 - 只选择年份(找了很久发现网上只有选择年月的控件,于是基于extjs年月控件设计了只选择年份的控件)

    Extjs4.1日期年月控件

    使用Extjs4.1编写了只能选择年月的日期控件

    extjs网页控件开发

    3. **事件处理**:利用ExtJS的事件系统,如change事件,来监听用户的选择并触发相应的行为。 4. **Store配置**:配置Store的proxy,连接到后台数据源,可以是JSONP、Ajax或者远程服务器。 5. **模板和渲染器**:定义...

    ExtJs:收集基于ExtJs扩展的一些控件

    再来看“ExtJs:收集基于ExtJs扩展的一些控件3”。这个文件可能包含了一些最新的或者实验性的控件,可能涉及到前沿的技术,如响应式设计、触摸事件支持等。对于开发者来说,了解和掌握这些控件可以帮助他们在构建...

    Extjs 5 日期时间控件

    此外,日期时间控件还支持事件监听,如`select`事件,当用户选择了一个新的日期和时间后触发,这在处理用户输入和更新关联的数据模型时非常有用。同时,控件还提供了验证功能,确保用户输入的日期和时间符合指定的...

    Extjs4.1可用的日期时间选择控件

    在EXTJS 4.1框架中,日期时间选择控件是开发者经常需要用到的组件,用于在用户界面中方便地输入和选择日期与时间。本文将详细介绍EXTJS 4.1中的日期时间选择控件,并针对可能存在的不合理之处进行讨论。 首先,...

    ExtJS时间控件、IP输入控件【控件】

    3. **JavaScript(JS)**:作为ExtJS的基础,JavaScript是实现这些控件交互的核心语言。开发者使用JavaScript编写事件处理函数,监听用户的操作,如点击按钮或输入文字,然后更新UI状态,执行相应的逻辑,如验证IP...

    extjs 4.0 日期时间控件

    7. **国际化支持**:日期时间控件支持多语言,包括中文。通过调整框架的本地化文件,可以实现不同语言环境下的正确显示。 8. **自定义模板**:如果你对默认的显示样式不满意,可以自定义模板,以满足特定的设计需求...

    ExtJS3.0日期时间控件

    3. **事件处理**:DateTimeField触发各种事件,如`select`事件在用户选择新的日期和时间后触发,开发者可以监听这些事件来执行相应的操作,比如更新数据模型或验证输入。 4. **样式和布局**:DateTimeField可以适应...

    extjs 多文件上传控件

    ExtJS 是一个强大的...综上所述,实现ExtJS多文件上传控件涉及到前端的文件选择、表单提交、进度显示,以及后端的文件接收和处理等多个环节。通过熟练掌握这些知识点,你可以创建出高效且用户友好的文件上传功能。

    extjs struts2 多图片批量上传控件

    在本场景中,"extjs struts2 多图片批量上传控件"是一个集成解决方案,允许用户通过ExtJS前端框架批量上传多张图片,并通过Struts2后端框架进行处理。 **ExtJS** 是一个基于JavaScript的UI库,它提供了丰富的组件和...

    EXTJS时间控件年月日时分秒

    在EXTJS中,时间控件是常见的交互元素,允许用户选择特定的时间,包括年、月、日、时、分和秒。这篇文档将深入探讨EXTJS中的时间控件及其使用方法。 首先,EXTJS时间控件的设计理念是为了提供用户友好的时间选择...

    extjs 时间控件

    ExtJS 的时间控件也支持响应式布局,可以根据屏幕大小自动调整其显示方式,确保在各种设备上都有良好的用户体验。 9. **与服务器端的交互** 选定的时间可以通过AJAX请求发送到服务器,进行验证或存储。在提交表单...

Global site tag (gtag.js) - Google Analytics