3

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

在这种情况下我应该怎么做才能确保在正确的时间设置状态以及由于includeIn存在而应该出现的元素以便可以呈现它们?initialize而不是creationComplete第一次创建组件时似乎没有做到这一点。对该组件的任何连续调用都可以。

4

3 回答 3

4

仅供参考,这并不奇怪initialize,它在创建子元素之前被触发,creationComplete然后触发。因为creationComplete是初始化生命周期中最后一个触发的事件。

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

creationComplete对于任何组件在其所有子组件已触发其creationComplete.

查看 Adob​​e 的组件实例化生命周期文档

创造政策

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

进入状态

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

可见的状态属性。

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

于 2011-02-02T03:54:36.547 回答
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
于 2011-04-27T03:49:11.927 回答
1

我遇到了同样的情况,尽管每次显示状态时我都必须检查重置屏幕。最初的答案是我需要的,但我花了一点时间来整理它。这是关键:

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

...看起来像:

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 。

于 2011-08-18T20:13:04.457 回答