Некоторые свойства [Bindable] во Flex работают, некоторые нет - PullRequest
2 голосов
/ 10 июля 2009

Проблема решена, см. Ниже

Вопрос

Я работаю в 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 ]

6 голосов
/ 10 июля 2009

Похоже, ваши геттеры возвращают пустоты. Они должны возвращать уинты, в соответствии с вашими типами полей.

В противном случае ваш код должен работать нормально. Я собрал и протестировал рабочую версию с таймером, который устанавливает все четыре значения, поэтому вы можете видеть все четыре обновления:

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;
        }
    }
}

Взгляните на них, подключите все, и вы должны увидеть, что все это собралось вместе. Пишите обратно, если у вас есть какие-либо вопросы. Приветствия.

1 голос
/ 10 июля 2009

Когда вы определяете свои привязываемые источники с помощью методов получения и установки, кажется, что привязки не работают. Решение состоит в том, чтобы объявить привязываемое событие для вашего получателя и отправить событие в вашем установщике:

[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 */
}

Поэтому, когда ваш личный член изменяется, отправляется событие, которое уведомляет любой компонент, связанный с получателем, об изменении свойства.

...