Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flex (http://www.flasher.ru/forum/forumdisplay.php?f=84)
-   -   binding и addEventListerner (http://www.flasher.ru/forum/showthread.php?t=165401)

cheluskin 22.08.2011 18:45

binding и addEventListerner
 
Столкнулся с проблемой получения события изменения переменной. Т.е. когда переменная изменяется нужно чтобы выполнилась функция. Но как это сделать ? Подскажите пожалуйста

Код AS3:

[Bindable (event = "statusChange")]
public var status:Boolean;
 
addEventListener("statusChange",changeStateContact);
 
private function changeStateContact():void{
currentState = "online";
}


xsar 22.08.2011 18:52

а не проще реализовать через сеттер?
Код AS3:

private var _status:Boolean;
public function set status(value:Boolean):void{
_status=value;
currentState = 'online';
}


cheluskin 22.08.2011 19:01

Цитата:

Сообщение от xsar (Сообщение 1024516)
а не проще реализовать через сеттер?
Код AS3:

private var _status:Boolean;
public function set status(value:Boolean):void{
_status=value;
currentState = 'online';
}


Да спасибо , это то, что нужно.

Silicium 22.08.2011 21:19

Тем не менее? Ситуации разные бывают.

son_of_war 26.08.2011 16:03

Когда ты в Bindable указываешь имя события, которое означает изменение свойства, компилятор не создает обертку вокруг этой переменной, в которой бы генерировалось событие. Подразумевается, что ты сам будешь посылать это событие. Этот подход нужен когда ты делаешь, скажем, read - only свойство, которое должно участвовать в биндинге в mxml (в этом случае чтобы все работало придется добавить декларацию события в метаданных класса или mxml компонента) или присутствует какая-то сложная логика обработки событий.

В твоем случае можно сделать вот так.

[Bindable]
public var status:Boolean;

private function changeStateContact(event:PropertyChangeEvent):void{

if (event.property == "status"){
currentState = "online";
}
}

и где-нибудь в инициализации компонента или в конструкторе класса добавить
addEventListener(PropertyChangeEvent.PROPERTY_CHANGE,changeStateContact);

cheluskin 28.08.2011 15:32

Спасибо, это очень интересно и очень странно, получается использование [Bindable] только всё усложняет, а предназначено как раз упростить использование сеттеров и геттеров. И не вижу смысла тогда вообще его использовать, тем более, что в flash builder геттеры и сеттеры генерируются одним кликом на нужной переменной.

son_of_war 29.08.2011 13:19

Видишь, мета теги Bindable и Event нужны скорее компилятору для генерации кода action script из mxml.
Например, если ты хочешь воткнуть в mxml нечно подобное
<mx:Text text="{this.status ? 'статус установлен походу' : 'нихт арбайтен'}"/>
и если ты не укажешь на переменной status тег Bindable, компилятор будет ругаться, что не удается засечь изменения переменной.
В компилированном коде никаких метаданных нет, там будет обычные команды addEventListener ... dispatchEvent.

Есть один интересный проект, который позволяет более удобно использовать деревянный механизм событий flex. Это mate framework.
Ты там подключаешь одну библиотечку, создаешь в mxml маппинг где расписывается на какие события каких классов будут подключены какие обработчики, там можно отслеживать изменения свойств объектов.
Потом этот маппинг надо вставить где - нибудь в mxml и все.
Можно расписать целую цепочку событий при изменении какого-нибудь объекта. Для большого проекта это более удобно, чем вручную набивать кучу геттеров / сеттеров и отлавливать где что не работает


Часовой пояс GMT +4, время: 15:11.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.