Apache flex 通过Flex中的ActionScript循环创建MXML组件

Apache flex 通过Flex中的ActionScript循环创建MXML组件,apache-flex,actionscript,foreach,flash-builder,mxml,Apache Flex,Actionscript,Foreach,Flash Builder,Mxml,我正在使用Flash Builder 4.6为uni项目创建一个应用程序。我有一个定制的Spark组件,我需要在运行时根据通过PHP脚本返回的XML元素数量动态创建该组件的多个实例 这可能有点混乱,所以让我写下以下步骤: 1) 应用程序向服务器上托管的PHP脚本发送HTTPService请求。 2) PHP访问SQL数据库并返回一系列XML数据。 3) ActionScript动态创建自定义Flex组件的X个实例,其中X是XML中的数据数 以下是我到目前为止得到的代码(不整洁,因为我正在努力使其

我正在使用Flash Builder 4.6为uni项目创建一个应用程序。我有一个定制的Spark组件,我需要在运行时根据通过PHP脚本返回的XML元素数量动态创建该组件的多个实例

这可能有点混乱,所以让我写下以下步骤: 1) 应用程序向服务器上托管的PHP脚本发送HTTPService请求。 2) PHP访问SQL数据库并返回一系列XML数据。 3) ActionScript动态创建自定义Flex组件的X个实例,其中X是XML中的数据数

以下是我到目前为止得到的代码(不整洁,因为我正在努力使其工作):

动作脚本:

        [Bindable]
        public var holderArray:Array = new Array(100);

        public function createMenu(e:MouseEvent):void {
            var count:int = 0;
            var curMenuItem:menuItemContainer = new menuItemContainer();
            while (count < loadedMenu.length){
                curMenuItem.itemName = loadedMenu.getItemAt(count).name;
                curMenuItem.itemDesc = loadedMenu.getItemAt(count).description;
                curMenuItem.itemPrice = numForm.format(loadedMenu.getItemAt(count).price);                  
                curMenuItem.imageFile = loadedMenu.getItemAt(count).url;
                //curMenuItem.y = count * 120
                //menuItemGroup.addElement(curMenuItem);
                holderArray[count] = curMenuItem;
                count ++;
            }
            //testString = holderArray[1].itemName;
            var count2:int = 0;
            for each (var menuItem:menuItemContainer in holderArray){
                menuItem.name = "menuItem" + count2;
                menuItem.id = "menuItem" + count2;
                //testString += menuItem.name;
                menuItemGroup.addElement(menuItem);
                count2++;
            }
        }
[Bindable]
公共变量保持数组:数组=新数组(100);
公共函数createMenu(e:MouseEvent):无效{
变量计数:int=0;
var curMenuItem:menuItemContainer=new menuItemContainer();
while(计数<加载菜单长度){
curMenuItem.itemName=loadedMenu.getItemAt(count).name;
curMenuItem.itemDesc=loadedMenu.getItemAt(count).description;
curMenuItem.itemPrice=numForm.format(loadedMenu.getItemAt(count.price));
curMenuItem.imageFile=loadedMenu.getItemAt(count).url;
//curMenuItem.y=计数*120
//menuItemGroup.addElement(curMenuItem);
holderArray[计数]=curMenuItem;
计数++;
}
//testString=holderArray[1].itemName;
var count2:int=0;
对于每个(变量menuItem:holderArray中的menuItemContainer){
menuItem.name=“menuItem”+count2;
menuItem.id=“menuItem”+count2;
//testString+=menuItem.name;
menuItemGroup.addElement(menuItem);
count2++;
}
}
MXML:


这段代码所发生的事情似乎是,返回的三个XML数据中的每一个都在menuItemContainer实例中使用,但当每一个都添加到menuItemGroup时,都会覆盖已经存在的数据。我不确定该项是否真的被覆盖,或者新项是否只是位于早期项之上,但如果后者为真,我无法找到安排组件的方法。我尝试在循环中设置menuItem.y(作为count2的函数),但没有效果

提前感谢您提供的所有建议/答案。 本杰明。

把这条线划上

var curMenuItem:menuItemContainer = new menuItemContainer();

在你的while循环中。按原样使用代码,您只需创建一个
menuItemContainer
实例,然后在while循环中不断更改该
menuItemContainer
实例的属性。相反,您需要在循环的每次迭代中创建一个新的、不同的
menuItemContainer
实例。

看起来有人已经给了您正确的答案。我唯一的其他评论是,您可以考虑将您的项目显示在列表W/IN渲染器和XMListList中,而不是手动创建孩子并将它们放置在一个组内。我必须在这一点上返回@ www. flopasa.:在这种情况下,您应该使用列表或DATGRAUP(或Flex 3中的转发器)。简单多了。我还在学很多Flex的东西。我才用了几个月。似乎有很多不同的方法来实现任何事情(就像大多数编程一样)。如果我使用XMLListCollection,我将如何在应用程序中显示它?我尝试使用一个数据组,但没有成功。干杯。是的,结束了,谢谢。我认为在每次迭代中将它们添加到VGroup中会显示对象的一个实例及其当前数据,但似乎我错了。再次感谢!B
var curMenuItem:menuItemContainer = new menuItemContainer();