2010-01-11 80 views
0

我在flex项目中有两个mxml文件: 但是,当我跟踪a.cBtn时,它是空的。 为什么要这样?Flex:实例化mxml组件的问题

test.mxml:

<?xml version="1.0" encoding="utf-8"?> 
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="runIt()"> 
<mx:Script> 
<![CDATA[ 
    public function runIt():void 
    { 
    var a:abc = new abc(); 
    trace(a.cBtn);//a.cBtn is null here 
    } 
]]> 
</mx:Script> 
</mx:Application> 

而且,abc.mxml:

<?xml version="1.0" encoding="utf-8"?> 
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" width="400" height="300"> 
<mx:Button x="108" y="73" label="Button" id="cBtn"/> 

</mx:Canvas> 

回答

0

这里的基本问题是,在Flex中,不创建一个给定的柔性容器组件的子组件,直到该容器被初始化。在将添加到显示列表后,初始化过程开始。如上所述,CREATION_COMPLETE事件在完成初始化并且实例化子元素后触发,因此您可以安全地访问此处的子元素。

这非常难看,但是如果您在将组件添加到显示列表之前绝对需要访问组件的子组件,则可以在容器上调用“initialize()”。

public function runIt():void 
{ 
    var a:abc = new abc(); 
    trace(a.cBtn);//a.cBtn is null here 
    a.initialize(); 
    trace(a.cBtn);//a.cBtn is not null here 
} 
0

你需要等待creationcomplete事件。

public function runIt():void 
{ 
    var a:abc = new abc(); 
    a.addEventListener(FlexEvent.CREATION_COMPLETE, traceIt) 
    trace(a.cBtn);//a.cBtn is null here 
} 
private function traceIt(e:Event):void 
{ 
    trace(a(e.target).cBtn) 
} 
+0

将creationPolicy在这里有什么作用? – 2010-01-15 17:26:32

+1

creationpolicy是您在视图中隐藏组件时使用的参数,例如在3个选项卡选项卡导航器中,第二个和第三个选项卡未初始化,直到您点击它们,ubless设置了creationpolicy =“all”,所以在上面的情况下添加按钮它不会帮助。 – Eran 2010-01-16 06:29:25