Flex:实例化mxml组件时出现问题

时间:2010-01-11 05:52:52

标签: flex

我在flex项目中有两个mxml文件: 但是当我跟踪a.cBtn时,它是null。 为什么会这样?

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>

2 个答案:

答案 0 :(得分: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)
}

答案 1 :(得分:0)

这里的根本问题是,在Flex中,在初始化该容器之前,不会创建给定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
}