Некоторые свойства [Bindable] во Flex работают, некоторые нет
Проблема решена, см. Ниже
Вопрос
Я работаю в Flex Builder 3 и у меня есть два класса ActionScript 3 (ABC
а также XYZ
) и проект Flex MXML (main.mxml
). У меня есть экземпляр XYZ
как свойство ABC
, и я хочу XYZ
свойства, которые будут видны ([Bindable]
) в проекте Flex в текстовых элементах управления.
К сожалению, только prop3
а также prop4
обновить, когда они изменены. Я вошел в отладчик, чтобы убедиться, что prop1
а также prop2
изменить, но они не обновляются в текстовых элементах управления.
Вот код:
ABC.as
[Bindable]
public class ABC extends UIComponent {
/* Other properties */
public var xyz:XYZ = new XYZ();
/* Methods that update xyz */
}
XYZ.as
[Bindable]
public class XYZ extends Object {
private var _prop1:uint = 0;
private var _prop2:uint = 0;
private var _prop3:uint = 0;
private var _prop4:uint = 1;
public function get prop1():uint {
return _prop1;
}
public function set prop1(value:uint):void {
_prop1 = value;
}
/* getters and setters for prop2, prop3, and prop4 */
}
main.mxml
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:com="com.*" />
<com:ABC id="abc" />
<mx:Text text="{abc.xyz.prop1}" />
<mx:Text text="{abc.xyz.prop2}" />
<mx:Text text="{abc.xyz.prop3}" />
<mx:Text text="{abc.xyz.prop4}" />
</mx:Application>
Ответ
Это не очевидно из небольших фрагментов кода, которые я разместил, но изнутри XYZ
Я обновлял _prop3
а также _prop4
используя свои сеттеры. В обнову я обновил _prop1
а также _prop2
через их частные переменные, а не их установщики. Таким образом, свойства 1 и 2 не были отправлены события обновления.
2 ответа
Похоже, ваши добытчики возвращают пустоты. Они должны возвращать uints, в соответствии с вашими типами полей.
В противном случае ваш код должен работать нормально. Я собрал и протестировал рабочую версию с таймером, который устанавливает все четыре значения, поэтому вы можете видеть все четыре обновления:
Main.mxml:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" xmlns:local="*" creationComplete="onCreationComplete()">
<mx:Script>
<![CDATA[
private function onCreationComplete():void
{
var t:Timer = new Timer(1000);
t.addEventListener(TimerEvent.TIMER, t_tick);
t.start();
}
private function t_tick(event:TimerEvent):void
{
var i:uint = Timer(event.currentTarget).currentCount;
abc.xyz.prop1 = i;
abc.xyz.prop2 = i;
abc.xyz.prop3 = i;
abc.xyz.prop4 = i;
}
]]>
</mx:Script>
<local:ABC id="abc" />
<mx:VBox>
<mx:Text text="{abc.xyz.prop1}" />
<mx:Text text="{abc.xyz.prop2}" />
<mx:Text text="{abc.xyz.prop3}" />
<mx:Text text="{abc.xyz.prop4}" />
</mx:VBox>
</mx:Application>
ABC.as
package
{
import mx.core.UIComponent;
[Bindable]
public class ABC extends UIComponent
{
public var xyz:XYZ = new XYZ();
public function ABC()
{
super();
}
}
}
XYZ.as
package
{
[Bindable]
public class XYZ extends Object
{
private var _prop1:uint = 0;
private var _prop2:uint = 0;
private var _prop3:uint = 0;
private var _prop4:uint = 1;
public function XYZ()
{
super();
}
public function get prop1():uint {
return _prop1;
}
public function set prop1(value:uint):void {
_prop1 = value;
}
public function get prop2():uint {
return _prop2;
}
public function set prop2(value:uint):void {
_prop2 = value;
}
public function get prop3():uint {
return _prop3;
}
public function set prop3(value:uint):void {
_prop3 = value;
}
public function get prop4():uint {
return _prop4;
}
public function set prop4(value:uint):void {
_prop4 = value;
}
}
}
Посмотрите на них, подключите вещи, и вы должны увидеть все это вместе. Пишите обратно, если у вас есть какие-либо вопросы. Приветствия.
Когда вы определяете свои привязываемые источники с помощью методов получения и установки, кажется, что привязки не работают. Решение состоит в том, чтобы объявить привязываемое событие для вашего получателя и отправить событие в вашем установщике:
[Bindable]
public class XYZ extends Object {
private var _prop1:uint = 0;
private var _prop2:uint = 0;
private var _prop3:uint = 0;
private var _prop4:uint = 1;
[Bindable(event="prop1Changed")]
public function get prop1():uint {
return _prop1;
}
public function set prop1(value:uint):void {
_prop1 = value;
dispatchEvent (new Event ("prop1Changed"));
}
/* getters and setters for prop2, prop3, and prop4 */
}
Поэтому, когда ваш личный член изменяется, отправляется событие, которое уведомляет любой компонент, связанный с геттером, об изменении свойства.