PDA

Просмотр полной версии : binding и addEventListerner


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


[Bindable (event = "statusChange")]
public var status:Boolean;

addEventListener("statusChange",changeStateContact);

private function changeStateContact():void{
currentState = "online";
}

xsar
22.08.2011, 18:52
а не проще реализовать через сеттер?
private var _status:Boolean;
public function set status(value:Boolean):void{
_status=value;
currentState = 'online';
}

cheluskin
22.08.2011, 19:01
а не проще реализовать через сеттер?
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 и все.
Можно расписать целую цепочку событий при изменении какого-нибудь объекта. Для большого проекта это более удобно, чем вручную набивать кучу геттеров / сеттеров и отлавливать где что не работает