Flex: доступ к функциям / компонентам через mxml-страницы - PullRequest
3 голосов
/ 09 октября 2008

Для простоты, скажем, у меня есть две страницы flex mxml.

form.mxml
button.mxml

Если страница form.mxml имеет следующий код, он должен работать нормально:

<custom:SelectView dSource="{_thedata}" id="form" visible="false">
</custom:SelectView>

<mx:LinkButton label="Show" id="lbShow" click="form.visible=true;>
<mx:LinkButton label="Show" id="lbHide" click="form.visible=false;>

Но если код был такой:

form.mxml

 <custom:SelectView dSource="{_thedata}" id="form" visible="false">
 </custom:SelectView>

button.mxml

<mx:LinkButton label="Show" id="lbShow" click="form.visible=true;>
<mx:LinkButton label="Show" id="lbHide" click="form.visible=false;>

как мне позвонить с button.mxml, чтобы изменить form.mxml

---- немного больше деталей ---

Моя страница на самом деле выглядит так: где query: AdvancedSearchFields в основном включает в себя гибкую форму на странице, и я хочу, чтобы она показала / скрыла пользовательское представление ниже после завершения поиска.

<query:AdvancedSearchFields searchType="projects" searchCategory="advanced" visible="true" id="AdvancedSearch" />

<custom:SelectView dSource="{_searchResults}" id="sv" visible="false">

Ответы [ 3 ]

4 голосов
/ 09 октября 2008

Вы можете написать собственный метод, который обрабатывает события нажатия кнопки и вызывает пользовательское событие. Затем в form.mxml вы можете обработать это событие.

Разделить его так, как это немного чище, так как он заставляет файл button.mxml работать самостоятельно. Если у Button.mxml есть прямая ссылка на вашу форму, то между ними возникает тесная связь, и, как правило, вам следует избегать тесной связи.

РЕДАКТИРОВАТЬ: у меня только что была другая мысль, которая также избегает тесной связи и немного проще:

form.mxml

<custom:SelectView dSource="{_thedata}" id="form" visible="{buttons.showForm}">
</custom:SelectView>

<!-- include your buttons.mxml component using an ID of "buttons" -->

buttons.mxml

<mx:Script>
<![CDATA[
    [Bindable] public var showForm:Boolean = true;
]]>
</mx:Script>

<mx:LinkButton label="Show" id="lbShow" click="this.showForm=true;">
<mx:LinkButton label="Hide" id="lbHide" click="this.showForm=false;">

По сути, это эмулирует использование настраиваемого события с помощью привязки переменных. Каждый раз, когда переменная showForm в кнопках изменяет видимое свойство SelectView, будет обновляться через привязки. Это легче, чем создание пользовательского события (хотя я думаю, что пользовательские события немного лучше для него).

0 голосов
/ 14 октября 2008

Если вам нужно чаще заниматься этой проблемой, я бы предложил использовать MVC-фреймворк, такой как PureMVC. Он настроен так, что у вас есть объект-посредник, который прослушивает события от компонентов MXML, а затем отправляет уведомление, которое может быть получено любым другим посредником. Затем этот посредник может управлять своим собственным визуальным компонентом на основе уведомления и связанных с ним данных.

В контексте того, что вы делаете (простая версия), вы согласны с базовым решением. Но как только вы разберетесь с четырьмя или пятью или более компонентами с большим количеством логики, вы не будете счастливы вообще.

0 голосов
/ 09 октября 2008

Ваш класс button.mxml должен иметь ссылку на экземпляр класса 'form', который будет затронут. Тогда он может работать с ним напрямую:

Button.mxml:

<mx:Script>
<![CDATA[
    [Bindable] public var myForm:MyFormClass;
]]>
</mx:Script>

<mx:LinkButton label="Show" id="lbShow" click="myForm.form.visible=true;">
<mx:LinkButton label="Show" id="lbHide" click="myForm.form.visible=false;">

Как правило, наиболее логичным местом для установки этой переменной является родительский элемент вашего Button класса.

...