Привязать к свойству объекта - PullRequest
2 голосов
/ 25 ноября 2011

AS

[Bindable]
var object:Object = {
    property: "Property"
};

MXML

<s:Label text="{object.property}"/>

Текст меток будет "Свойством", но если объект.свойство изменено, метка не обновится.Есть ли способ обойти это?

Ответы [ 2 ]

4 голосов
/ 25 ноября 2011

Свойства объекта или коллекции не будут отправлять событие изменения свойства, если оно не реализовано.

Аналогично вашему примеру, изменение элемента Array не будет связано.

Коллекции, такие какArrayCollection переносит объекты в прокси для отправки событий для привязки.

Используйте ObjectProxy для отправки изменений в ваш объект.

Создайте экземпляр ObjectProxy и прослушайте PropertyChangeEvent:

objectProxy = new ObjectProxy(object);
objectProxy.addEventListener(PropertyChangeEvent.PROPERTY_CHANGE, propertyChangeHandler);

Доступ к вашему объекту через прокси, например, установка свойства с именем 'property':

objectProxy.property = "Hello, world";

В этом примере создается ObjectProxy с таймером для изменения члена 'property' каждую секунду:

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
               xmlns:s="library://ns.adobe.com/flex/spark"
               xmlns:mx="library://ns.adobe.com/flex/mx"
               minWidth="955"
               minHeight="600"
               creationComplete="creationCompleteHandler(event)">


    <fx:Script>
        <![CDATA[
            import mx.events.FlexEvent;
            import mx.events.PropertyChangeEvent;
            import mx.utils.ObjectProxy;


            private var object:Object = {};
            private var objectProxy:ObjectProxy;

            private var timer:Timer;

            protected function creationCompleteHandler(event:FlexEvent):void
            {
                objectProxy = new ObjectProxy(object);
                objectProxy.addEventListener(PropertyChangeEvent.PROPERTY_CHANGE, propertyChangeHandler);

                timer = new Timer(1000);
                timer.addEventListener(TimerEvent.TIMER, timerHandler);
                timer.start();
            }

            protected function propertyChangeHandler(event:PropertyChangeEvent):void
            {
                label.text = (event.source).property;
            }

            protected function timerHandler(event:TimerEvent):void
            {
                objectProxy.property = Math.random() * 1000;
            }
        ]]>
    </fx:Script>


    <s:Label id="label" />


</s:Application>
1 голос
/ 25 ноября 2011

Вы привязываетесь к самому объекту. Это означает, что текст метки изменится, только если будет изменена ссылка на объект.

object={property:"Hello World"}

В этом случае переплет сделает всю работу.

Если вы хотите, чтобы текст обновлялся после некоторого изменения свойства, вы должны сделать это свойство привязываемым.

public class MyObject {
    [Bindable]
    public var property:String;
}

Затем объявите переменную класса MyObject и свяжите ее с property.

...