在以下代码中,对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>
答案 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