Java Blog for Alex Wan

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

          統(tǒng)計(jì)

          留言簿(10)

          BlogJava

          Blogs

          DIV+CSS

          JQuery相關(guān)

          友情鏈接

          常去的地方

          數(shù)據(jù)供應(yīng)

          閱讀排行榜

          評(píng)論排行榜

          [ExtJs]基于EXT2的RadioGroup

          背景:
          Ext2標(biāo)準(zhǔn)實(shí)現(xiàn)的Radio不夠用!一方面是布局不太方便,另一方面是事件比較難用.所以我實(shí)現(xiàn)了一種以onChange事件為中心的RadioGroup.
          實(shí)現(xiàn)代碼:

            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 閱讀(5824) 評(píng)論(3)  編輯  收藏 所屬分類: JavaScript

          評(píng)論

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

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

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


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

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

          學(xué)習(xí)  回復(fù)  更多評(píng)論   

          主站蜘蛛池模板: 大宁县| 保康县| 柘城县| 会宁县| 齐河县| 宜黄县| 黔江区| 长宁县| 集贤县| 嵊泗县| 华坪县| 石台县| 祥云县| 保德县| 东平县| 岑巩县| 汾西县| 泗水县| 奉节县| 乌鲁木齐市| 辰溪县| 晋宁县| 关岭| 鸡泽县| 公安县| 思南县| 青神县| 石屏县| 罗定市| 云阳县| 濮阳县| 大余县| 突泉县| 扶余县| 平罗县| 无棣县| 裕民县| 大关县| 荆州市| 新乐市| 瑞安市|