效果预览
定义方法
XML定义
<RadioGroup id="radioGroup"> <Property name="value">3</Property> <RadioButton> <Property name="value">1</Property> <Property name="text">南非</Property> </RadioButton> <RadioButton> <Property name="value">2</Property> <Property name="text">阿根廷</Property> </RadioButton> <RadioButton> <Property name="value">3</Property> <Property name="text">巴西</Property> </RadioButton> <RadioButton> <Property name="value">4</Property> <Property name="text">墨西哥</Property> </RadioButton> <RadioButton> <Property name="value">5</Property> <Property name="text">哥伦比亚</Property> </RadioButton> </RadioGroup>
JSON定义
var radioGroup = { "$type":"RadioGroup", "radioButtons":[ { "text":"南非", "value":"1" }, { "text":"阿根廷", "value":"2" }, { "text":"巴西", "value":"3" }, { "text":"墨西哥", "value":"4" }, { "text":"哥伦比亚", "value":"5" } ], "id":"radioGroup", "value":"3" }
重要属性说明
layout
layout提供了两种选择,分别表示是横向布局RadioButton还是纵向布局RadioButton,效果图如下:
flow
vertical
value
RadioGroup会根据value属性激活对应的RadioButton的选中状态
技巧
技巧一:JS动态声明RadioButton
radioGroup.set("radioButtons",[ { "text":"南非", "value":"1" }, { "text":"阿根廷", "value":"2" }, { "text":"巴西", "value":"3" }, { "text":"墨西哥", "value":"4" }, { "text":"哥伦比亚", "value":"5" } ]);
技巧二:利用PropertyDef的mapping机制定义RadioButton
大多数的情况下我们都会定义DataType,并利用AutoForm和DataGrid做编程,在这种情形下,对于内部的AutoFormElement和DataColumn元素,如果我们希望以RadioGroup形式展现除了上述明确定义RadioGroup的方式之外,还有另一种更好的方法:
我们知道PropertyDef支持mapping的设定,这儿介绍如何利用这个特性生成RadioGroup中的buttons,首先定义Mapping:
<PropertyDef name="propertyDef1"> <Property name="mapping"> <Property name="mapValues"> <Collection> <Entity> <Property name="label">南非</Property> <Property name="value">1</Property> </Entity> <Entity> <Property name="label">阿根廷</Property> <Property name="value">2</Property> </Entity> <Entity> <Property name="label">巴西</Property> <Property name="value">3</Property> </Entity> <Entity> <Property name="label">墨西哥</Property> <Property name="value">4</Property> </Entity> <Entity> <Property name="label">哥伦比亚</Property> <Property name="value">5</Property> </Entity> </Collection> </Property> <Property name="keyProperty">value</Property> <Property name="valueProperty">label</Property> </Property>
分两种使用场景:
场景一:AutoFormElement
在AutoForm中与propertyDef1绑定的AutoFormElement,如果希望将上述的mapping设定作为自身的RadioButton元素,则只要设定其editorType属性为RadioGroup即可,如图:
场景二:DataColumn
在DataGrid中与propertyDef1绑定的DataColumn,如果希望将上述的mapping设定作为自身的RadioButton元素,则需要设定其renderer属性为dorado.widget.grid.RadioGroupCellRenderer,如图:
另外在mapping的技术中,我们知道mapping中的内容是可以利用DataProvider技术动态生成的,这样我们还能利用mapping技术的这种特征动态的从数据库中的一张物理表中动态生成RadioButton元素.
有关mapping的dataProvider技术参考:快速入门的mapping技术讲解(http://wiki.bsdn.org/display/d7training/01.+mapping)
技巧三:DataColumn中不同行有不同的RadioButton,效果如图:
上图这种效果,我们就无法通过技巧二中的mapping技术解决,这个时候可以考虑利用DataGrid中的自定义DataColumn的renderer技术实现。技巧二的场景二使用了Dorado默认提供的dorado.widget.grid.RadioGroupCellRenderer控件,现在我们尝试自己创建一个renderer控件:
var CellRenderer = $extend(dorado.widget.grid.SubControlCellRenderer, { createSubControl : function(arg) { var entity = arg.data; var editor = getEditor(entity); if (editor) { editor.set("width", "100%"); } return editor; }, refreshSubControl : function(editor, arg) { if (editor) editor.set("value", arg.data.get("value")); } });
其中getEditor方法是一个自定义的方法,它将根据entity中的数据动态创建不同的RadioButton,如:
function getEditor(entity) { var editor = new dorado.widget.RadioGroup(); var param = entity.get("radioButtons"); editor.set("layout", "flow"); if (param) { var radioButtons = []; parseParam(param).each(function(pair) { radioButtons.push({ value : pair.key, text : pair.value }); }); editor.set("radioButtons", radioButtons); } return editor; } function parseParam(param) { if (!param) return null; var pairs = []; param.split(';').each(function(pair) { var i = pair.indexOf('='), key, value; if (i >= 0 && i < (pair.length - 1)) { pairs.push({ key : pair.substring(0, i), value : pair.substring(i + 1) }); } else { pairs.push({ value : pair }); } }); return pairs; }
这样最后我们只要设置DataColumn的render属性为这个新建的CellRenderer对象就可以,如:
dataColumn.set("renderer", new CellRenderer());
Attachments:





