【问题标题】:Flex : Problem with instantiating an mxml componentFlex:实例化 mxml 组件时出现问题
【发布时间】:2010-01-11 05:52:52
【问题描述】:

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

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>

【问题讨论】:

    标签: apache-flex


    【解决方案1】:

    这里的根本问题是,在 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
    }
    

    【讨论】:

      【解决方案2】:

      您需要等待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)
      }
      

      【讨论】:

      • creationPolicy 在这里会有影响吗?
      • creationpolicy 是您在视图中有隐藏组件时使用的参数,例如在 3 个选项卡选项卡导航器中,第二个和第三个选项卡在您单击它们之前不会初始化,除非您设置creationpolicy="all" ,因此在上述情况下添加按钮将无济于事。
      猜你喜欢
      • 2012-03-09
      • 2012-04-20
      • 2010-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-04
      相关资源
      最近更新 更多