MXML 类初始化顺序

Posted

技术标签:

【中文标题】MXML 类初始化顺序【英文标题】:MXML-class initialization order 【发布时间】:2011-10-20 02:00:08 【问题描述】:

我在 Flex 4 中编写了一些自定义组件,并多次遇到此问题。

var myForm:MyForm = new MyForm;
myForm.SetData(data);
addElement(myForm);

现在想象一下,我从 Panel 或 VGroup(或任何其他容器)的非构造函数调用这些函数。令人讨厌的是,在 MyForm.SetData() 期间,并非所有声明的 myForm 字段都已初始化。如:

<s:VGroup id="dataGroup">

如果我的 SetData() 函数想要访问 dataGroup(由于 .addElement() 刚刚收到的数据),它只是失败并出现空指针异常,因为尚未创建 dataGroup,尽管这是在之后构造函数。如何保证表单已经完全初始化?

【问题讨论】:

【参考方案1】:

侦听creationComplete 事件并将您的组件添加到事件的处理程序中是一种方法。这就是 Sam DeHaan 的建议。

另一种方法是覆盖createChildren() 函数。这是创建和添加组件的所有子组件的函数。代码看起来像这样:

override public function createChildren():void

    super.createChildren();

    var myForm:MyForm = new MyForm;
    // Note that data may be null here, best to 
    // override commitProperties() to set it.
    myForm.SetData(data);   
    addElement(myForm);

docs on the component lifecycle 将提供有关此主题的大量详细信息。

【讨论】:

这正是我正在寻找的文档。【参考方案2】:

除非我误解了你的问题,

您应该将遇到此空指针异常的代码放在您需要定义的容器上的 creationComplete 回调中。

【讨论】:

除了使用那个回调没有别的办法了吗?我真的更愿意控制这些函数的执行顺序,否则我将不得不编写一个带有内部标志的烦人的解决方法。 这不是很漂亮,但你可以使用 callLater,很可能。类似于:: callLater(addElement,[myForm])。但是,如果您不在 VGroup/Panel 等内部,则不能 callLater(dataGroup.addElement...) 因为 callLater 会等到下一帧,您可能取决于您的应用程序能够信任的 VGroup 已创建。

以上是关于MXML 类初始化顺序的主要内容,如果未能解决你的问题,请参考以下文章

java类初始化顺序

类加载顺序

Java类成员初始化顺序

Java类继承关系中的初始化顺序

java类执行顺序

java中类成员初始化顺序