Гибкий:Доступ к функциям / компонентам на страницах mxml
-
06-07-2019 - |
Вопрос
Для простоты предположим, что у меня есть две страницы flex mxml.
форма.mxml
кнопка.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;>
Но если бы код был похож:
форма.mxml
<custom:SelectView dSource="{_thedata}" id="form" visible="false">
</custom:SelectView>
кнопка.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">
Решение
Вы могли бы написать пользовательский метод, который обрабатывает события нажатия кнопки и вызывает пользовательское событие.Затем в form.mxml вы можете обработать это событие.
Разделение его таким образом немного чище, так как это заставляет файл button.mxml работать сам по себе.Наличие в Button.mxml прямой ссылки на вашу форму приводит к тесной связи между ними, и, как правило, вам следует избегать тесной связи.
Редактировать:У меня только что возникла другая мысль, которая также позволяет избежать жесткой связи и немного проще:
форма.mxml
<custom:SelectView dSource="{_thedata}" id="form" visible="{buttons.showForm}">
</custom:SelectView>
<!-- include your buttons.mxml component using an ID of "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 в кнопках изменяется, свойство visible SelectView будет обновляться с помощью привязок.Это легче, чем создание пользовательского события (хотя я думаю, что пользовательские события немного лучше подходят для его оформления).
Другие советы
Ваш button.mxml
класс должен иметь ссылку на экземпляр класса 'form', который будет затронут.Тогда он может воздействовать на него напрямую:
Кнопка.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
класс.
Если вам нужно чаще сталкиваться с этой проблемой, я бы посоветовал использовать MVC-фреймворк, такой как PureMVC.Он настроен так, что у вас есть объект-посредник, который прослушивает события из компонентов MXML, затем отправляет уведомление, которое может быть получено любым другим посредником.Затем этот посредник может манипулировать своим собственным визуальным компонентом на основе уведомления и связанных с ним данных.
В контексте того, что вы делаете (простая версия), вас устраивает базовое решение.Но как только вы будете иметь дело с четырьмя, пятью или более компонентами с большим количеством логики, вы совсем не будете счастливы.