我有一个组件,一旦准备就绪,我需要根据我从XML读入的变量设置状态。我尝试用creationComplete
来做,但它显然没有准备好,因为状态没有设置元素渲染正确,但状态&如果我通过对某个元素执行单击操作进行后续状态更改,则渲染工作正常。
在这种情况下我应该做些什么来确保在正确的时间设置状态&因includeIn
而应该出现的元素是否可以呈现?第一次创建组件时,initialize
而不是creationComplete
似乎没有做到这一点。对组件的任何连续调用都没问题。
答案 0 :(得分:4)
仅供参考,initialize
不起作用并不奇怪,它在创建子元素之前被触发,然后creationComplete
触发。由于creationComplete
是要触发的init生命周期中的最后一个事件。
有时,如果组件的creationComplete
事件过早触发,则需要从父容器更改子组件状态。
creationComplete
任何组件在其所有子组件触发creationComplete
后触发。
查看Adobe的documentation for the component instantiation life cycle
您可能还需要将应用的creationPolicy
属性设置为all
。 (我认为它的默认值是auto
)
您可以在状态声明中挂钩enterState
上的事件处理程序,一旦运行状态中的对象应该可用。
最终,您可以将基于状态的对象的容器设置为不可见/不包含在布局中(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。