0

我有一个问题一直让我发疯。我使用以下代码在 Flex 中动态创建了一个表单:

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 的表单,其中包括基于可用配置文件的复选框 + 一个保存按钮来保存这些配置文件。

但是,当用户单击保存按钮以保存配置文件时,我使用以下方法检索选定的框,但该函数仅将最后添加的 CheckBoxes 识别为 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 子项是什么,它会返回一个空字符串。

我究竟做错了什么?

4

3 回答 3

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);
                    }
                }
            }
        }
于 2012-06-06T10:58:59.670 回答
0

我现在无法真正解决问题,但你为什么不简单地引用数组中的 CheckBox 呢?这将是一种快速简便的解决方法。您还将受益于扁平的层次结构,使访问更容易(更快,这在大多数情况下都无关紧要)。

于 2012-06-06T10:46:41.500 回答
0

假设这是 Flex4 / Spark:原因是您使用的是组件的原始“子代”而不是“元素”。对于 Spark 架构中的容器,您应该始终使用元素(使用类似numElementsorgetElementAt()而不是getChildren()or的方法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使用自定义创建 a 并将ItemRendereraCheckBox和设置_profiles为其dataProvider.

于 2012-06-06T11:24:39.100 回答