2011-08-04 92 views
0

我已经在Flex 4中编写了一些自定义组件,并且遇到了这个问题几次。MXML类的初始化顺序

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

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

<s:VGroup id="dataGroup"> 

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

回答

3

聆听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将提供有关这个主题的一吨的细节。

+0

这正是我正在寻找的文档。 –

+0

@kdansky,那么你应该接受这个答案:) –

1

除非我误解你的问题,

你应该把运行到一个creationComplete回调,你需要定义的容器上这个空指针异常的代码。

+0

除了使用回调之外没有别的方法吗?我真的更喜欢控制这些函数执行的顺序,否则我将不得不用内部标志来编写一个讨厌的解决方法。 –

+0

这不是很好,但你可以使用callLater,很可能。类似于:: callLater(addElement,[myForm])。然而,如果你不在VGroup/Panel等内部,你不能调用Later(dataGroup.addElement ...)。当一个callLater等到下一帧时,你*可以*取决于你的应用程序能够信任VGroup已经被创造了。 –