【问题标题】:MXML-class initialization orderMXML 类初始化顺序
【发布时间】: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,尽管这是在之后构造函数。如何保证表单已经完全初始化?

【问题讨论】:

    标签: apache-flex actionscript components initialization mxml


    【解决方案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 已创建。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-17
    • 1970-01-01
    • 2018-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多