强制重绘组件

时间:2011-01-10 04:20:57

标签: flex

我有一个带登录屏幕的应用程序。当用户点击“enter”时,状态变为“login”&触发子组件加载(尽管此时子项保持不可见)。子项包含用户登录时需要的许多功能(即,他们的屏幕名称和设置是从数据库中检索的)。以下内容包含在“父级”中:

<local:comp id="localComp" includeIn="login" includeInLayout="false" visible="false"/>
<mx:Button label="login" click="currentState='login'"/>
<mx:Button label="logout" click="currentState='Default'"/>

我的问题是当用户退出时(状态更改为“默认”)&amp;然后重新登录(状态变回'登录')孩子不再被“触发”&amp;孩子的功能不会重新加载。有没有办法强迫我的孩子刷新?

注意:虽然将子项的函数移动到父项更容易,但它很复杂...我将这些函数移动到子项以使其更容易理解

更新:我甚至尝试在我的状态中添加“exitState”:

<s:State name="login" exitState="removeElement(localComp)" /> 

这也不起作用,因为我收到错误:“RangeError:索引0超出范围。”

更新: 即使您被允许从父母调用孩子的功能,我的问题是孩子需要“创建”才能显示错误。对我来说,为什么flex团队会做出像删除和删除这样的事情是没有意义的。让孩子们这么复杂。

3 个答案:

答案 0 :(得分:0)

首先,我认为您不必在自定义组件中设置includeIn和visible + includeInLayout属性。使用includeIn时,框架将自动从显示列表中删除组件,而不是“登录”状态。

要回答你的问题,我会使用相当addToStage(在你的自定义组件中)事件或currentStateChanged(在父组件中)事件。当状态更改为登录时,应触发这些事件

答案 1 :(得分:0)

您的孩子不会再次被“触发”,因为每次切换状态时它都是同一个孩子。 Flex只是切换它的可见性 - 它仍然是完全相同的对象。如果你想在添加ToTage时做特定的事情,你会想要在状态改变时删除/添加那个孩子而不是仅仅切换它的可见性。

执行此操作的有效方法是使用Flex 3的<mx:AddChild/>

示例:

<mx:states>

        <mx:State name="login">

            <mx:AddChild position="firstChild">

                <local:comp id="localComp"/>

            </mx:AddChild>

        </mx:State>
</mx:states>

答案 2 :(得分:0)

如果我正确地阅读此内容,localComp是一个非可视组件,可以解决将您登录到某项服务的繁重问题,对吗?

enterStatelocalComp点火吗?你可以从那里打电话给init。或者,如果init()是组件的初始化处理程序,请让它执行任何必要的管道工作,并将实际的登录时间代码移动到单独的函数中。

当然,实际上我并不是这样做的。将逻辑放入一个组件中,该组件具有允许它成为显示对象图的一部分的所有基础结构,然后不显示它,这是浪费的。相反,让你的“组件”继承自Object或者其他东西,然后在脚本块中简单地声明它的一个实例。然后,您可以直接从login的{​​{1}}处理程序调用其逻辑。只需使用状态来更新UI的状态......这实际上就是它们的用途。

click