Лучший способ показать и скрыть компоненты MXML - PullRequest
1 голос
/ 09 ноября 2011

Я работаю над приложением, в котором мне нужно иметь два отдельных экрана, и мне нужно переключаться между ними.Я абсолютный новичок в Flex & Flash, и я не нашел ничего о том, как это сделать за 2 дня поиска в Google.Это действительно не должно быть так сложно сделать!:)

Вот что я пробовал.Я создал проект Flex и добавил 2 файла компонентов MXML под названием Test1 & Test2, и в каждом из них просто есть кнопка с меткой Button1 & Button2, чтобы я мог видеть, отображается ли правильный компонент.Ниже приведен код кнопки в файле компонента Test1 MXML:

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

В файле приложения MXML у меня есть 2 состояния, которые называются State1 и State2.Я также добавил в этот файл следующее:

<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), я ожидаю, что теперь он покажет компонент MXML Test2 (поскольку я меняю currentState на State2, но это не так. Test1 по-прежнему отображается с Button1, показывающим.

Может кто-то пролить свет на то, что я делаю неправильно? Или предложить лучший (или правильный) способ сделать это?

Заранее спасибо!

1 Ответ

2 голосов
/ 09 ноября 2011

Похоже, что состояния в вашем приложении не связаны с состояниями в ваших компонентах.Простое присвоение им одного и того же имени никак не связывает их.В любом случае, если вы просто пытаетесь скрыть / переключить компоненты в своем основном Приложении, вам действительно нужны там только состояния.

Один из вариантов - просто получить доступ к свойству 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'" />

Этот способ более общий и просто лучше ООП.Однако, если вы хотите, чтобы ваши компоненты могли запускать больше, чем просто одно состояние, вам, возможно, придется сделать что-то более сложное.Это должно дать вам представление о том, куда идти, по крайней мере.

...