显示和隐藏MXML组件的最佳方式

时间:2011-11-09 17:55:55

标签: actionscript-3 flex flex4

我正在开发一个应用程序,我需要基本上有两个独立的屏幕,我需要能够在它们之间切换。我是Flex& amp;的总菜鸟Flash和我在谷歌搜索的两天内没有找到任何关于如何做到这一点。真的不应该这么难! :)

这是我尝试过的。我创建了一个Flex项目并添加了两个名为Test1& amp;的MXML组件文件。 Test2和每个按钮都有一个按钮,其标签为Button1& Button2所以我可以看到是否显示正确的组件。下面是Test1 MXML组件文件中的按钮代码:

<s:Button id="btn1" label="Button1" click="currentState = 'State2'">

在MXML应用程序文件中,我有2个状态称为State1&amp;状态2。我也将以下内容添加到此文件中:

<local:Test1 includeIn="State1" x="0" y="0"></local:Test1>
<local:Test2 includeIn="State2" x="0" y="200"></local:Test2>

我还将状态添加到所有3个文件中:

<s:states> 
    <s:State name="State1"/>
    <s:State name="State2"/>
</s:states>

当我运行应用程序时,我看到Test1正如我所期望的那样,因为State1是列出的第一个状态。当我单击Test1中的按钮(标记为Button1)时,我希望它现在显示Test2 MXML组件(因为我将currentState更改为'State2',但它没有。测试1仍然显示Button1显示。

有人能否解释我做错了什么?或者提出一个更好(或适当)的方法来做到这一点?

提前致谢!

1 个答案:

答案 0 :(得分:2)

听起来您的应用程序中的状态未连接到组件中的状态。只是给它们相同的名称不会以任何方式连接它们。无论如何,如果您只是想在主应用程序中隐藏/切换组件,那么您实际上只需要那里的状态。

一种选择是直接从组件中访问应用程序的currentState属性:

<s:Button id="btn1" label="Button1" click="FlexGlobals.topLevelApplication.currentState = 'State2'"/>

这样做有效,但不建议这样做,因为它强烈地将组件与父应用程序耦合在一起,如果你必须重构(或与其他人一起工作),在一个大型项目中会导致混乱。

另一个选择是让每个组件调度一个事件让父母知道它应该改变:

<fx:Metadata>
  [Event(name="changeParentState", type="flash.events.Event")]
</fx:Metadata>
<s:Button id="btn1" label="Button1" click="dispatchEvent(new Event('changeParentState'));"/>

然后,父母将决定应切换到哪个州:

<local:Test1 includeIn="State1" changeParentState="currentState='State2'" />
<local:Test2 includeIn="State2" changeParentState="currentState='State1'" />

这种方式更通用,只是更好的OOP。但是,如果您希望组件能够触发的不仅仅是单个状态,则可能需要执行更复杂的操作。这应该让你了解至少去哪里。