背景:
Ext2标准实现的Radio不够用!一方面是布局不太方便,另一方面是事件比较难用.所以我实现了一种以onChange事件为中心的RadioGroup.
实现代码:
1
Ext.namespace('Ext.ux');
2
3
Ext.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
};
9
Ext.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
56
Ext.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
};
62
Ext.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
});
171
Ext.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.