我有一个让我疯狂的问题。我使用以下代码在Flex中动态创建Form:
private function init():void {
//Dynamically create form based on profiles
for each(var role:AclRoleDTO in _profiles) {
//Create form item
var fi:FormItem = new FormItem();
fi.label = role.name;
//Create checkbox
var cbx:CheckBox = new CheckBox();
cbx.id = "role_"+role.id.toString();
cbx.label = role.description;
cbx.width = 250;
cbx.selected = true;
//Add Checkbox for form item
fi.addChild(cbx);
profileForm.addChild(fi);
}
//Add save button
var fib:FormItem = new FormItem();
var btn:Button = new Button();
btn.name = "Save";
btn.label = "Save";
btn.id = "saveButton";
btn.addEventListener(MouseEvent.CLICK, onSubmitClicked);
fib.addChild(btn);
profileForm.addChild(fib);
}
这很好用,并创建一个FormItems Form,其中包括基于可用配置文件的CheckBoxes +一个保存按钮来保存这些配置文件。
但是,当用户点击保存按钮保存配置文件时,我使用以下方法检索所选的框,但该功能仅将最后添加的CheckBox识别为CheckBox ...
private function onSubmitClicked(event:MouseEvent):void {
var formElements:Array = profileForm.getChildren();
var roleIds:ArrayCollection = new ArrayCollection();
var i:int = 0;
var j:int = 0;
//Parse the entire form
for (i; i < formElements.length; i++) {
if (formElements[i] is FormItem) {
var formItem:FormItem = formElements[i];
var itemElements:Array = formItem.getChildren();
for (j;j<itemElements.length;j++) {
//If form item is a checkbox, check if the box is checked!
if (itemElements[j] is CheckBox) {
var tmpBox:CheckBox = itemElements[j];
if (tmpBox.selected) {
//random stuff
}
}
}
}
}
//Send event with roleIds!
//More random stuff
}
我已经尝试了各种各样的事情以确保循环正常工作并且确实:它遍历适当数量的FormItem元素并检索适当数量的childrenElements。除了循环遍历最后添加的FormItem之外,它不会将任何子项识别为CheckBox。如果我使用flash.utils.getQualifiedClassName(itemElements [j])来找出其他FormItem子元素是什么,则返回一个空字符串。
我做错了什么?
答案 0 :(得分:2)
以下是您的问题的工作代码:
private function onSubmitClicked(event:MouseEvent):void
{
var selectedRoles:ArrayCollection = new ArrayCollection();
var formItems:Array = rolesForm.getChildren();
for (var i:int = 0; i < formItems.length; i++)
{
var formItem:FormItem = formItems[i];
var formItemElements:Array = formItem.getChildren();
for each (var control:UIComponent in formItemElements)
{
if (control is CheckBox)
{
var tempBox:CheckBox = control as CheckBox;
if(tempBox.selected)
selectedRoles.addItem(tempBox);
}
}
}
}
答案 1 :(得分:0)
我现在无法解决问题,但为什么不简单地在数组中引用CheckBox?这将是一种快速简便的解决方法。您还可以从平面层次结构中受益,使访问更容易(更快,在大多数情况下无关紧要)。
答案 2 :(得分:0)
假设这是Flex4 / Spark:原因是你使用的是组件的原始“子”而不是“元素”。对于Spark架构中的容器,您应始终使用元素(使用numElements
或getElementAt()
而不是getChildren()
或addChild()
等方法)。 'children'方法仅由Spark组件在内部使用;你永远不应该使用它们来向容器添加元素。
因此,如果您使用addChild()
替换每个addElement()
,则会解决您的问题。 onSubmitClicked()
方法看起来像这样:
for (var i:int = 0; i < profileForm.numElements; i++) {
var formItem:FormItem = profileForm.getElementAt(i) as FormItem;
if (formItem) {
var cb:CheckBox = formItem.getElementAt(0) as CheckBox;
trace(cb); //null if it's not a CheckBox
}
}
话虽如此,我认为你没有理由想要动态创建这个表单。如果您需要的是CheckBoxes列表,请创建一个List
,其中ItemRenderer
的自定义CheckBox
设置为_profiles
,并将dataProvider
设置为{{1}}。< / p>