Apache flex 如果动态创建项目,我无法确定如何通过其ID访问项目

Apache flex 如果动态创建项目,我无法确定如何通过其ID访问项目,apache-flex,actionscript-3,actionscript,flex3,Apache Flex,Actionscript 3,Actionscript,Flex3,在我的应用程序的一个区域中,我正在创建一个在循环期间使用actionscript构建自身的显示。(在我的实际应用程序中,有很多嵌套的子项,我的函数可能正在查找这些子项中的任何一个)当我为每个项分配一个ID时,但当我试图通过它的ID访问该项时,它失败了。有什么好处?我如何才能在不了解所有可能的父元素的情况下找到UI组件呢 这是我正在做的一个简单的例子。单击按钮将失败并出现错误 ReferenceError:Error#1069:在测试中未找到属性myPanel3,并且没有默认值 试试这个: &l

在我的应用程序的一个区域中,我正在创建一个在循环期间使用actionscript构建自身的显示。(在我的实际应用程序中,有很多嵌套的子项,我的函数可能正在查找这些子项中的任何一个)当我为每个项分配一个ID时,但当我试图通过它的ID访问该项时,它失败了。有什么好处?我如何才能在不了解所有可能的父元素的情况下找到UI组件呢

这是我正在做的一个简单的例子。单击按钮将失败并出现错误

ReferenceError:Error#1069:在测试中未找到属性myPanel3,并且没有默认值


试试这个:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="init();">
<mx:Script>
    <![CDATA[
        import mx.containers.Panel;
        private function init():void{
            var i:uint = 0;
            for(i = 0; i<10; i++){
                var loopPanel:Panel = new Panel;
                loopPanel.title = i.toString();
                loopPanel.name = "myPanel" + i.toString();                                 
                myVBox.addChild(loopPanel);
            }
        }

        private function clicked():void{
            var tracePanel:DisplayObject = myVBox.getChildByName("myPanel3");                
            trace(tracePanel.name);

        }
    ]]>
</mx:Script>
<mx:VBox id="myVBox" x="10" y="10" width="500"/>
<mx:Button id="myBtn" x="518" y="8" label="Click Me" click="clicked();"/>



嵌套-如果需要在不搜索子组件的情况下访问自定义对象,您可能应该为自定义对象创建一个字典(例如,带有“名称”-“对象引用”对的关联数组)。

这将起作用,但我需要一种在不知道VBoxes ID、名称或它是否存在的情况下访问面板的方法。正如我所说,我的实际应用程序比示例要复杂得多,我希望有一个更干净的方法,然后必须通过所有父级。查看最后一段,我认为没有这样的内置存储。或者你每次都可以浏览对象树。字典是个好主意,以前从来没有想过要做这样的事情,有点像自己识别它们。知道为什么动态分配ID不起作用吗?我认为实际上更多的是关于MXML的工作原理,它创建指向主类上那些组件的公共变量。如果您对它的工作方式感兴趣,请将“-keep generated actionscript”添加到编译器参数中,并查看代码。
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="init();">
<mx:Script>
    <![CDATA[
        import mx.containers.Panel;
        private function init():void{
            var i:uint = 0;
            for(i = 0; i<10; i++){
                var loopPanel:Panel = new Panel;
                loopPanel.title = i.toString();
                loopPanel.name = "myPanel" + i.toString();                                 
                myVBox.addChild(loopPanel);
            }
        }

        private function clicked():void{
            var tracePanel:DisplayObject = myVBox.getChildByName("myPanel3");                
            trace(tracePanel.name);

        }
    ]]>
</mx:Script>
<mx:VBox id="myVBox" x="10" y="10" width="500"/>
<mx:Button id="myBtn" x="518" y="8" label="Click Me" click="clicked();"/>
  loopPanel.name = "myPanel" + i.toString();   
  var tracePanel:DisplayObject = myVBox.getChildByName("myPanel3");