PDA

Просмотр полной версии : MXML и AS3


ikozlov
26.04.2012, 19:35
Доброго времени суток.
Раньше писал на AS3, но никогда не затрагивал MXML т.к. UI делался всегда в Flash CS. А сейчас уперся в то, что надо поддерживать UI и код в одном месте. Выбрал Flash Builder.
И сходу уперся в 2е вещи
1. В MXML хотелось бы "нарисовать" только UI, а обработчики событий вынести в класс на AS3
2. Скомпилированная SWF несет с собой ряд других SWF библиотек, которые мне не нудны(и изрядно увеличивают вес приложения)

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

wvxvw
26.04.2012, 19:52
MXML это шаблон, из него получается AS3 и он, в свою очередь основывается на AS3. Например, если у вас есть AS3 класс example/Foo.as и вы создали Bar.mxml такой, что:
<components:Foo xmlns:components="example.*" />
то в Bar.mxml вам будут доступны методы Foo, точно так же, как если бы вы просто унаследовались от этого класса (за очень небольшим исключением - сгенерированый код, например, увидев, что класс наследуется от UIComponent переопределит в нем moduleFactory свойство). Но это мелочи.
Другой вариант - можно в теге <Script/> указывать source="file.as" аттрибут, и это будет работать как include, но лучше так не делать изза того, что редакторы такой подход плохо понимают.
В принципе вы точно так же можете унаследовать класс от класса созданного в MXML файле, но лучше этого не делать, потому что MXML добавляет кучу сгенерированных методов и работать с ними в классе-наследнике очень проблематично.

Так же, компоненты по задумке авторов, задуманы так, чтобы им можно было делать скины не меняя их самих. Но нет хороших инструментов для того, чтобы это делать. Да и вообще очень муторно.

ikozlov
26.04.2012, 20:01
А можно попросить простенький пример, как можно навесить обработчик на кнопку, которая создана в mxml, а обработчик находился в .as3
из вышеописанного общая теория понятна, но вот как обратиться к объекту?

Добавлено через 18 минут
И очень важен момент с доп либами т.к. вес очень велик

sstotenkopf
26.04.2012, 20:40
установите айди для объекта, по нему и обращайтесь

Jewelz
26.04.2012, 20:42
<mx:Button click="doSearch(event)" label="Search" right="10" top="10"/>
<mx:Script>
<![CDATA[
private function doSearch(e:MouseEvent):void
{

}
]]>
</mx:Script>

ikozlov
26.04.2012, 20:55
<mx:Button click="doSearch(event)" label="Search" right="10" top="10"/>
<mx:Script>
<![CDATA[
private function doSearch(e:MouseEvent):void
{

}
]]>
</mx:Script>

ну такой вариант мне не подходит так как есть необходимость в отдельном файле .as3 держать все обработчики

Добавлено через 1 минуту
установите айди для объекта, по нему и обращайтесь

так в этом то и вопрос - как обратиться? Предположим у меня есть mxml где описан объект с id = newButton
Что нужно указать в mxml для того чтобы класс подгрузился и можно было бы навешивать обработчики и как должен выглядеть обработчик?

Inet_PC
26.04.2012, 22:43
В прикрепленном примере (сори за то, что Flex 3.2, нет под рукой ничего более) три варианта реализации того, что Вы хотите. Третий вариант (inline) самый ужасный и использовать его не стоит, это однозначно. Вообще из-за того Flex/Flash builder не делает это за нас писать код становится довольно сложно и самое печальное кода становится в разы больше. Немного выручают скины во Flex 4.0 и выше. Которые своего рода тоже codeBehind. То есть если вы так сильно противитесь кода внутри mxml файлов, то скины это лучшее из возможных вариантов (примеров в интернете предостаточно). И хотелось бы услышать хотябы одну внятную причину не писать код в mxml - е? Если что не так, то прошу поправить.

Inet_PC
26.04.2012, 22:47
На самом деле так легко только в простом приведенном примере. Беда в том, что не всегда можно точно сказать когда flex создаст компонент и мы получим ссылку на него. Flex не создает все сразу, например если кнопка объявлена в каком-то стейте, то ссылку мы не получим до тех пор, пока компонент не войдет в это состояние.

ikozlov
26.04.2012, 23:01
И хотелось бы услышать хотябы одну внятную причину не писать код в mxml - е?

Да нету адекватной причины - просто хотелось разнести и небыло понимания что будут проблемы с биндингом такие серьезные.
На самом деле просто сделаю другой вид абстракции. спасибо, все стало более менее ясно.