“新”在flex创建周期中适合哪里?

时间:2010-05-26 01:46:19

标签: flex new-operator startup

在以下代码中,对myChild.bar()的调用会导致异常,因为myChild为null。 myParent是一个有效的对象。我不明白为什么还没有创建myChild。

我已阅读以下与对象创建顺序相关的文档,但我不确定“new”是如何相关的: http://livedocs.adobe.com/flex/3/html/help.html?content=layoutperformance_03.html

感谢任何帮助!

// Main.mxml

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="created()">
    <mx:Script>
        <![CDATA[
            public var myParent:Parent = new Parent();
            public function created():void {
                myParent.foo();
            }
        ]]>
    </mx:Script>
</mx:Application>

// Parent.mxml

<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" xmlns="*">
    <mx:Script>
        <![CDATA[
            public function foo():void {
                myChild.bar();
            }
        ]]>
    </mx:Script>
    <Child id="myChild"/>
</mx:Canvas>

// Child.mxml

<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml">
    <mx:Script>
        <![CDATA[
             public function bar():void {
                trace("Hello World");
            }
        ]]>
    </mx:Script>    
</mx:Canvas>

2 个答案:

答案 0 :(得分:1)

创建对象及其所有子元素并将其绘制到屏幕时,将激活

creationComplete。由于您的父对象是使用

创建的
public var myParent:Parent = new Parent();

它不是主对象的子节点,creationComplete事件在myParent初始化之前触发。

实际上,myParent.myChild将保持为null,直到某些内容导致myParent初始化。您可以通过将其添加到屏幕上的组件来实现此目的,也可以调用myParent.initialize();

答案 1 :(得分:0)

Flex是一个可视化显示/ UI框架。它旨在保留UI项目的显示列表,并处理显示列表中项目的各种更新。

问题是您从未将父组件添加到显示列表中。如果您使用的是Flex 4 Spark体系结构,则可以使用Flex 2/3 Halo体系结构中的AddChild方法或AddElement完成此操作。

使用AddChild方法将Parent组件添加到舞台后,该组件将开始单步执行组件lifeCycle,其中包括创建它的Children(通过createChildren()方法),以及调整和定位子组件(通过updateDisplayList() )。通过MXML定义组件和子项时 - 例如,您的Parent.mxml文件将Child类定义为使用XML的子项 - addChild方法调用在后台“自动”完成。

请记住,Flex Component LifeCycle是一个过程,可能不是即时的。如果在父项上执行addChild;您可能无法在下一行立即访问该父母的子女。

因此,新关键字会创建组件的新实例;但它不会将该组件放在displayList上以供Flex Framework布局管理器处理。

纠正这种情况的一种方法可能是对主应用程序文件进行此更改:

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="created()">
    <mx:Script>
        <![CDATA[
            public function created():void {
                myParent.foo();
            }
        ]]>
    </mx:Script>
    <parent:Parent id="myParent" />
</mx:Application>

另一个可能是这个:

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="created()">
    <mx:Script>
        <![CDATA[
            public var myParent:Parent = new Parent();
            public function created():void {
                myParent.foo();
            }
            override protected function createChildren():void{
                super.createChildren();
                this.addChild(myParent);
            }

        ]]>
    </mx:Script>
</mx:Application>

有关这些内容的一些好读物,请阅读Flex Component LifeCycle文档。 http://livedocs.adobe.com/flex/3/html/ascomponents_advanced_2.html#204762