Flex 4 States:includeIn和component creationComplete

时间:2011-02-02 03:11:14

标签: events flex state flex-spark

我有一个组件,一旦准备就绪,我需要根据我从XML读入的变量设置状态。我尝试用creationComplete来做,但它显然没有准备好,因为状态没有设置元素渲染正确,但状态&如果我通过对某个元素执行单击操作进行后续状态更改,则渲染工作正常。

在这种情况下我应该做些什么来确保在正确的时间设置状态&因includeIn而应该出现的元素是否可以呈现?第一次创建组件时,initialize而不是creationComplete似乎没有做到这一点。对组件的任何连续调用都没问题。

3 个答案:

答案 0 :(得分:4)

仅供参考,initialize不起作用并不奇怪,它在创建子元素之前被触发,然后creationComplete触发。由于creationComplete是要触发的init生命周期中的最后一个事件。

有时,如果组件的creationComplete事件过早触发,则需要从父容器更改子组件状态。

creationComplete任何组件在其所有子组件触发creationComplete后触发。

查看Adobe的documentation for the component instantiation life cycle

creationPolicy的

您可能还需要将应用的creationPolicy属性设置为all。 (我认为它的默认值是auto

enterState

您可以在状态声明中挂钩enterState上的事件处理程序,一旦运行状态中的对象应该可用。

visible.state属性。

最终,您可以将基于状态的对象的容器设置为不可见/不包含在布局中(visible和includeInLayout属性)。在场合,您将没有任何其他方法通过代码到达对象,因为它赢了不存在。但是,enterState只应在输入视图状态时执行,因此该状态内的对象应完全可用。

答案 1 :(得分:1)

我认为您可以通过设置itemCreationPolicy = immediate来强制您需要访问的有状态组件。然后它们将存在于creationComplete。

<s:states>
<s:State name="normal" />
<s:State name="special" />
</s:states>

<s:Label text="normal" includeIn="normal" /> //is available creationComplete
<s:Label text="special1" includeIn="special" itemCreationPolicy="immediate" /> //is available creationComplete
<s:Label text="special2" includeIn="special" /> //not available creationComplete

答案 2 :(得分:1)

我有同样的情况,但每次显示状态时我都必须检查重置屏幕。最初的答案是我需要的,但是我需要一点时间来解决它。这是关键点:

  

您可以在状态声明中挂接事件处理程序 ... [强调添加]

...看起来像:

protected function state1_enterStateHandler(event:FlexEvent):void
{
    myComponent.reset();
}

<s:states>
    <s:State id="state1" name="state1" enterState="state1_enterStateHandler(event)" />
    <s:State name="state2" />
</s:states>

<views:MyComponent id="myComponent" includeIn="state1" />

我一直试图将事件处理程序添加到myComponent但没有成功。我宁愿把它放在那里,但这似乎是每次再次启用状态时更新的唯一方法。

每当state1变为currentState并且所有组件都已就绪并且已设置属性时,就会调用reset。