Flex: привязка данных на объекте - PullRequest
0 голосов
/ 05 января 2009

Допустим, у меня есть следующее:

public class MyObject
{

[Bindable]
public var foo:int = 3;


}

...

[Bindable]
var _obj:MyObject = null;

Какой лучший способ связать foo, чтобы эта привязка обновлялась, когда _obj установлен на новый экземпляр?

Я пробовал:

<mx:Label text="{_obj&amp;&amp;_obj.foo}"/>

Но это не красиво. Могу ли я выразить это как-нибудь, используя

Что думает сообщество SO :: Flex?

Ответы [ 4 ]

2 голосов
/ 05 января 2009

Связывание не зависит от свойств; Вы можете получить преимущества связывания с полями или свойствами.

Похоже, вы что-то упустили, может быть? Например, следующие MXML и AS работают для привязки как поля, так и свойства, когда класс и его экземпляр помечены как Bindable:

package
{
    [Bindable]
    public class MyFoo
    {
        public var myPublicField:int;
        private var _myPrivateField:int;

        public function MyFoo()
        {
            myPublicField = 0;
            myPublicProperty = 0;
        }

        public function get myPublicProperty():int
        {
            return _myPrivateField;
        }

        public function set myPublicProperty(value:int):void
        {
            _myPrivateField = value;
        }
    }
}

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">

    <mx:Script>
        <![CDATA[

            [Bindable]
            private var myFoo:MyFoo;

            private function increment():void
            {
                if (!myFoo)
                    myFoo = new MyFoo();

                myFoo.myPublicField += 1;
                myFoo.myPublicProperty += 1;
            }

            private function replace():void
            {
                myFoo = new MyFoo();
            }

        ]]>
    </mx:Script>

    <mx:VBox>
        <mx:HBox>
            <mx:Label text="Field:" />
            <mx:Text text="{myFoo.myPublicField}" />
        </mx:HBox>
        <mx:HBox>
            <mx:Label text="Property:" />
            <mx:Text text="{myFoo.myPublicProperty}" /> 
        </mx:HBox>
        <mx:Button label="Increment Both Counts" click="increment()" />
        <mx:Button label="Replace with New Foo" click="replace()" />
    </mx:VBox>

</mx:Application>

Кстати, эффект был бы таким же, если бы вы пометили поле и свойство Bindable отдельно, а не пометили класс, который является просто сокращением для одной и той же вещи. Также обратите внимание, что myFoo по умолчанию начинается с нуля, как и в вашем примере кода (т. Е. Назначение "= null" является избыточным).

Этот пример помогает? Если нет, оставьте комментарий, и я проверю обратно. Надеюсь, что это так!

1 голос
/ 05 января 2009

Сделать класс связываемым:

[Bindable]
public class MyObject
{
    [Bindable]
    public var foo:int = 3;
}

Тогда это работает?

<mx:Label text="{_obj.foo}"/>
0 голосов
/ 07 января 2009

Я бы посмотрел на класс mx.binding.utils.BindingUtils. Вы можете найти что-то там, но (как говорит Кристиан Нунциато выше) привязка данных действительно построена для изменений в свойстве объекта, а не самого объекта.

Приветствия

0 голосов
/ 05 января 2009

Используйте свойства вместо открытых переменных.

// Object

package MyObject
{
    public class MyObject
    {
        private var message:String;

        public function set Message(messagein:String):void
        {
            message = messagein;
            return;
        }

        [Bindable]
        public function get Message():String
        {
            return message;
        }

        public function MyObject()
        {
        }

    }
}

// Flex that calls it

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="281" height="156">
<mx:Script>
    <![CDATA[
        import MyObject.MyObject;
        [Bindable]
        private var o:MyObject = new MyObject();

        private function UpdateMessage():void
        {
            o.Message = TextIn.text;
            return;
        }
    ]]>
</mx:Script>
    <mx:Label x="31" y="29" text="{o.Message}" width="201" id="TextOut"/>
    <mx:TextInput x="31" y="55" id="TextIn"/>
    <mx:Button x="31" y="85" label="Button" click="UpdateMessage()"/>

</mx:Application>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...