Java Blog for Alex Wan

          Let life be beautiful like summer flowers and death like autumn leaves.

          統計

          留言簿(10)

          BlogJava

          Blogs

          DIV+CSS

          JQuery相關

          友情鏈接

          常去的地方

          數據供應

          閱讀排行榜

          評論排行榜

          [ExtJs]基于EXT2的RadioGroup

          背景:
          Ext2標準實現的Radio不夠用!一方面是布局不太方便,另一方面是事件比較難用.所以我實現了一種以onChange事件為中心的RadioGroup.
          實現代碼:

            1Ext.namespace('Ext.ux');
            2
            3Ext.ux.Radio =function(config)
            4{
            5    Ext.ux.Radio.superclass.constructor.call(this,config);
            6    this.group = config.group;
            7    this.value=config.value;
            8}
          ;
            9Ext.extend(Ext.ux.Radio ,Ext.form.Radio, {
           10     onRender : function(ct, position){
           11         Ext.ux.Radio.superclass.onRender.call(this, ct, position);
           12          if(this.el && this.el.dom){
           13            this.el.dom.value = this.value;//make the value for radio is the value user has given!
           14        }

           15         this.on('check',this.onCheck);
           16     }
          ,
           17    clearInvalid : function(){
           18         this.group.clearInvalid();
           19    }
          ,markInvalid : function(msg){
           20         this.group.markInvalid(msg);
           21    }
          ,
           22    onClick : function(){
           23        
           24        if(this.el.dom.checked !=this.checked){
           25             this.group.setValue(this.value);
           26        }

           27       
           28    }
          ,
           29     setValue : function(v){
           30        this.checked = (v === true || v === 'true|| v == '1|| String(v).toLowerCase() == 'on');
           31        if(this.el && this.el.dom){
           32            this.el.dom.checked = this.checked;
           33            this.el.dom.defaultChecked = this.checked;
           34            this.group.el.dom.value=this.value;
           35        }

           36    }
          ,onCheck:function(radio,checked)
           37    {
           38        
           39        Ext.log('radiao change!');
           40        if(checked)
           41        {
           42        var oldValue=this.group.getValue();
           43        this.group.onChange(this.group,oldValue,this.getValue());
           44        }

           45        
           46        //this.fireEvent('change', this.group, oldValue, newValue);
           47    }
          ,
           48     getValue : function(){
           49        if(this.rendered){
           50            return this.el.dom.value;
           51        }

           52        return false;
           53    }

           54}
          );
           55
           56Ext.ux.RadioGroup=function(config)
           57{
           58    this.radios=config.radios;
           59    this.defaultValue=config.defaultValue||false;
           60    Ext.ux.RadioGroup.superclass.constructor.call(this,config);    
           61}
          ;
           62Ext.extend(Ext.ux.RadioGroup,Ext.form.Field,  {
           63    defaultAutoCreate:{tag:'input', type:'hidden'},
           64     onRender : function(ct, position){
           65         
           66        Ext.ux.RadioGroup.superclass.onRender.call(this, ct, position);
           67        this.wrap = this.el.wrap({cls: "x-form-check-wrap"});
           68        if (this.radios && this.radios instanceof Array) {
           69            this.els=new Array();
           70            this.els[0]=this.el;
           71            for(var i=0;i<this.radios.length;i++){
           72                var r=this.radios[i];
           73                this.els[i]=new Ext.ux.Radio(Ext.apply({}{
           74                    renderTo:this.wrap,
           75                    hideLabel:true,
           76                    group:this
           77                }
          ,r));
           78                if (this.horizontal) {
           79                    this.els[i].el.up('div.x-form-check-wrap').applyStyles({
           80                        'display': 'inline',
           81                        'padding-left': '5px'
           82                    }
          );
           83                }

           84            }

           85            if(this.hidden)this.hide();
           86        }

           87        this.setDefaultValue();
           88    }
          ,initValue : function(){
           89        //Ext.log('initValue for'+this.name);
           90        if(this.value !== undefined){
           91            this.el.dom.value=this.value;
           92            
           93        }
          else if(this.el.dom.value.length > 0){
           94            this.value=this.el.dom.value;
           95        }

           96    }
          ,getValue:function()
           97    {
           98         if(this.rendered){
           99            return this.el.dom.value;
          100        }

          101        return false;
          102         /*
          103          if(this.value !== undefined){
          104            return this.value;
          105        }else if(this.el.dom.value.length > 0){
          106            return this.el.dom.value;
          107        }
          108        */

          109    }
          ,setValue:function(v)
          110    {
          111        var oldValue=this.getValue();
          112        if(oldValue==v)return ;
          113        for(var j=0;j<this.els.length;j++)
          114            {
          115                if(this.els[j].value==v)
          116                {
          117                    this.els[j].setValue(true);
          118                }

          119                else
          120                {
          121                    this.els[j].setValue(false);
          122                }

          123            }

          124     this.el.dom.value=v;
          125     this.fireEvent('change', this.group, oldValue, v);       
          126    }
          ,
          127    setDefaultValue:function()
          128    {
          129        for(var j=0;j<this.els.length;j++)
          130            {
          131                if(this.els[j].value==this.defaultValue)
          132                {
          133                    this.els[j].setValue(true);
          134                    return;
          135                }

          136                else
          137                {
          138                    if(j<this.els.length-1)
          139                    {
          140                        this.els[j].setValue(false);
          141                    }

          142                    else
          143                    {
          144                        this.els[j].setValue(true);
          145                    }

          146                    
          147                }

          148            }

          149     }
          ,
          150    // private
          151    onDestroy : function(){
          152        if (this.radios && this.radios instanceof Array) {
          153            var cnt = this.radios.length;
          154            for(var x=1;x<cnt;x++){
          155                this.els[x].destroy();
          156            }

          157        }

          158        if(this.wrap){
          159            this.wrap.remove();
          160        }

          161        Ext.ux.RadioGroup.superclass.onDestroy.call(this);
          162    }
          ,
          163    
          164    // private
          165    
          166    onChange : function(oldValue, newValue){
          167        this.fireEvent('change', this, oldValue, newValue);
          168    }

          169
          170}
          );
          171Ext.reg('ux-radiogroup', Ext.ux.RadioGroup);

          例子:
              var boolField= new Ext.ux.RadioGroup({
                  fieldLabel : 
          "actionNow",
                  allowBlank : 
          true,
                  horizontal:
          true,
                  maxLength : 
          200,
                  defaultValue:'
          true',
                  name : 
          "activity.ishavecare",
                  radios:[
          {boxLabel:'Yes',value:'true'},{boxLabel:'No',value:'false'}]
                  
                  
              }
          );
          boolField.on('change',
          function(radioGroup,oldValue,newValue)
          {

          Ext.log('value changes from '
          +oldValue+"  to "+newValue);
          }

          )




          Let life be beautiful like summer flowers and death like autumn leaves.

          posted on 2008-06-27 09:40 Alexwan 閱讀(5828) 評論(3)  編輯  收藏 所屬分類: JavaScript

          評論

          # re: [ExtJs]基于EXT2的RadioGroup 2008-06-27 12:25 aGuang(cRipple.Li(at)gmail.com)

          3q,博主!
          這里有個問題,我用firebug查看使用這個控件的表單post數據時發現會附帶一個參數值,
          如下:
          ext-comp-1029(這應該是ext生成的一個id)=true(或者是false,具體根據設置而定).不知道這個有什么用?還是只是個hidden表單數據?能否去掉呢?  回復  更多評論   

          # re: [ExtJs]基于EXT2的RadioGroup 2008-06-27 13:18 萬洪泉


          呵呵,當選中一個radio時就會發送當前選中的值,這個可以不去理會它.如果要去掉的話,可以在提交之前把group的所有成員都disable了,這樣就不會發送數據.但是這樣做會帶來一個問題,就是disable之后什么時候再去enable的問題.目前我還沒找到關于去掉這個隱藏的值的行之有效的方法..   回復  更多評論   

          # re: [ExtJs]基于EXT2的RadioGroup 2008-06-28 11:15 長江三峽

          學習  回復  更多評論   

          主站蜘蛛池模板: 万荣县| 温宿县| 福清市| 阿瓦提县| 东城区| 丹凤县| 确山县| 探索| 辽宁省| 麻栗坡县| 尉犁县| 丹阳市| 淳安县| 民勤县| 鸡西市| 江西省| 桦川县| 大连市| 垣曲县| 班戈县| 武威市| 青川县| 百色市| 长汀县| 喀喇| 潮州市| 永济市| 罗平县| 长宁区| 府谷县| 邛崃市| 本溪市| 金沙县| 肥东县| 礼泉县| 托克逊县| 沙河市| 霍邱县| 商河县| 融水| 禄劝|