MXML, Биндинг и другие страшные для ТРУЪ аскриптера вещи. Часть первая.
Вводная часть.
Что же надо чтобы использовать mxml?
1) Заводим флекс проект.
Все примеры я делаю во Flash Builder, но в других IDE, думаю проблем не возникнет
Не пугайтесь - он нужен чтобы подключился framework.swc, всё таки какую-то часть флексовского фрэймворка нам нужно будет использовать.
Затем в опциях компилятора прописываем merged into code и добавляем в Additional compiler options опции
-keep - показывать сгенерённые классы (они будут лежать в bin-debug/generated)
-link-report=report.xml - сформировать файл отчёта, будет в bin-debug/report.xml )
-default-size 800 600 - уставновить размер флэшки.
2) первое приложение.
Так как я назвал проект no_flex_mxml, то билдер сгенерил мне класс no_flex_mxml.mxml в качестве дефолтного.
пусть так и будет.
смотрим содержание:
<?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600"> <fx:Declarations> <!-- Place non-visual elements (e.g., services, value objects) here --> </fx:Declarations> </s:Application>
Видим какие-то xmlns.
Это нэймспесы. По сути это псевдонимы для импортов.
В общем видим, что флекса тут очень много.
Давайте сделаем просто обычный спрайт.
<?xml version="1.0" encoding="utf-8"?> <mx:Sprite xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:mx="library://ns.adobe.com/flex/mx" addedToStage="init();" > <fx:Declarations> <fx:Number id="property" /> </fx:Declarations> <fx:Script><![CDATA[ public function init():void { trace("init"); property = 10; } ]]> </fx:Script> <mx:Sprite id="child" addedToStage="trace('child added');" /> </mx:Sprite>
addedToStage - это ещё одна фишка mxml - события генерируемые объектами выглядят как свойства и их значениями является код хэндлеров.
Для того, чтобы работали автогенерации и подсказки, нужно описать правильно собственные события с помощью метатега Event.
<fx: Declarations> - нужен для невизуальных объектов.
Которые не размещаются внутри компонента.
К сожалению, код помещенный выше,
ошибочный.
Цитата:
'Sprite' declaration must be contained within the <Declarations> tag since it does not implement 'mx.core.IUIComponent'.
<?xml version="1.0" encoding="utf-8"?> <mx:Sprite xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:mx="library://ns.adobe.com/flex/mx" addedToStage="init();" > <fx:Declarations> <fx:Number id="property" /> <mx:Sprite id="child" addedToStage="trace('child added');" /> </fx:Declarations> <fx:Script><![CDATA[ public function init():void { trace("init"); property = 10; addChild(child); } ]]> </fx:Script> </mx:Sprite>
Заходим в папочку bin-debug/generated и видим там 3 класса:
_no_flex_mxml-binding-generated.as
class BindableProperty { /* * generated bindable wrapper for property child (public) * - generated setter * - generated getter * - original public var 'child' moved to '_94631196child' */ [Bindable(event="propertyChange")] public function get child():flash.display.Sprite { return this._94631196child; } public function set child(value:flash.display.Sprite):void { var oldValue:Object = this._94631196child; if (oldValue !== value) { this._94631196child = value; if (this.hasEventListener("propertyChange")) this.dispatchEvent(mx.events.PropertyChangeEvent.createUpdateEvent(this, "child", oldValue, value)); } } /* * generated bindable wrapper for property property (public) * - generated setter * - generated getter * - original public var 'property' moved to '_993141291property' */ [Bindable(event="propertyChange")] public function get property():Number { return this._993141291property; } public function set property(value:Number):void { var oldValue:Object = this._993141291property; if (oldValue !== value) { this._993141291property = value; if (this.hasEventListener("propertyChange")) this.dispatchEvent(mx.events.PropertyChangeEvent.createUpdateEvent(this, "property", oldValue, value)); } } }
child и property.
Ничего сверхъестественного и сложного. Просто запомните, заводя свойства в mxml - они в итоге оказываются завернутыми в геттер и сеттер с отсылкой события об изменении.
no_flex_mxml-generated.as
public class no_flex_mxml extends flash.display.Sprite { [Bindable] public var child:flash.display.Sprite; [Inspectable] [Bindable] public var property:Number; // constructor (non-Flex display object) public function no_flex_mxml() { super(); _no_flex_mxml_Sprite2_i(); // events this.addEventListener("addedToStage", ___no_flex_mxml_Sprite1_addedToStage); } // scripts // <Script>, line 11 - 17 - // Это скрипт который я написал в блоке fx:Script public function init():void { trace("init"); property = 10; addChild(child); } // supporting function definitions for properties, events, styles, effects private function _no_flex_mxml_Sprite2_i():flash.display.Sprite { var temp:flash.display.Sprite = new flash.display.Sprite(); temp.addEventListener("addedToStage", __child_addedToStage); child = temp; mx.binding.BindingManager.executeBindings(this, "child", child); return temp; } public function __child_addedToStage(event:flash.events.Event):void { trace('child added'); } public function ___no_flex_mxml_Sprite1_addedToStage(event:flash.events.Event):void { init(); } } }
ну и
no_flex_mxml-interface.as
public class no_flex_mxml extends flash.display.Sprite { public function no_flex_mxml() {} [Bindable] public var property : Number; [Bindable] public var child : flash.display.Sprite; mx_internal var _bindings : Array; mx_internal var _watchers : Array; mx_internal var _bindingsByDestination : Object; mx_internal var _bindingsBeginWithWord : Object; include "C:/dev/workspace/no_flex_mxml/src/no_flex_mxml.mxml:11,17"; }}
Много это или мало - решать вам.
Главное, что можно понять из размера - флексфрэймворка здесь нет)
Специально для этой статьи я завёл публичный репозиторий: https://bitbucket.org/k0t0vich/no_flex_mxml
пошагово - смотрите коммиты.
Всего комментариев 23
Комментарии
15.04.2012 18:10 | |
Очень круто. Требую продолжения!
|
15.04.2012 18:51 | |
Спасибо за статью. Это просто пример или Вы реально какой-то проект писали (пишите) так? Жду продолжения!
|
15.04.2012 19:03 | |
Реально пишу проект.
|
15.04.2012 19:22 | |
Там не только биндинги.
|
15.04.2012 19:25 | |
Конкретно в этом примере, только биндинги.
|
15.04.2012 19:57 | |
очень хочется увидеть чистый as3 проект с работающим BindingManager а не генерированный mxml комплиятором :~)
А еще лучше выпилить биндинг целиком и запустить его без подключения framework.swc |
|
Обновил(-а) artcraft 15.04.2012 в 20:01
|
15.04.2012 20:03 | |
Ну в report.xml кроме бингинга есть ещё
Цитата:
mx.core:mx_internal
mx.collections.errors:ItemPendingError mx.rpc:IResponder |
15.04.2012 20:04 | |
Цитата:
а не генерированный mxml комплиятором
|
15.04.2012 20:12 | |
тут пример биндинга без мхмл (правда не на флексовом менеджере) и ничего страшного в нём я не вижиу...
|
15.04.2012 20:20 | |
В вводной статье я давал много ссылок.
|
15.04.2012 20:39 | |
@Inet_PC во, именно это я и хотел увидеть
@Котяра "В вводной статье я давал много ссылок." пугающее количество ссылок надо будет почитать на досуге |
15.04.2012 21:38 | |
Не совсем пойму, в чем конкретно ползеность данной затеи?
Это не критика и тп... хочу познать и возможно в дальнейшем пользвоаться) |
15.04.2012 22:38 | |
Хоть и MXML мне выносит мозг, но понравилось! Жду новых подробностей
|
18.04.2012 08:43 | |
Я требую продолжения банкета!)
|
23.04.2012 00:22 | |
Хех, когда-то тоже об этом думал: http://kb2.adobe.com/community/publi...sid_52670.html
а потом - как-то не знаю. Я разочаровался в mxml шаблонах, но это долгая история. |
30.04.2012 13:58 | |
Цитата:
В следующей статье, я расскажу как обойти эту неприятность
|
01.05.2012 00:57 | |
Библиотеку с mx.binding подключили?
|
01.05.2012 12:21 | |
Цитата:
можно пока что хотя бы линку? а то я усё жду и жду
Линк на решение в моей репе. Код написал, а до объяснения руки не доходят.. Всё дело в волшебных пузырьках: |
08.03.2023 12:14 | |
Ой прям потеплело в душе )
|
Последние записи от Котяра
- Страх и ненависть в Нью-Дели или сборка мультипака для arm7 и x86 c Adobe AIR 14 в FB (16.06.2014)
- Нативный EventDispatcher в старлинге (27.11.2013)
- Нужны ошибки компиляции при создании экземпляра синглетона извне? Запросто! (13.09.2013)
- ARP - новый формат упаковки ресурсов (07.02.2013)
- DropShadowFilter и GlowFilter в Starling (16.01.2013)