【问题标题】:Bind to object property绑定到对象属性
【发布时间】:2011-11-25 05:14:16
【问题描述】:

作为

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

MXML

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

标签文本将为“属性”,但如果 object.property 发生更改,则标签不会更新。有没有办法解决这个问题?

【问题讨论】:

    标签: apache-flex data-binding actionscript air mxml


    【解决方案1】:

    除非实现,否则对象或集合的属性不会调度属性更改事件。

    与您的示例类似,不会绑定对 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>
    

    【讨论】:

      【解决方案2】:

      您正在绑定到对象本身。这意味着,只有当对对象的引用发生变化时,标签的文本才会发生变化。

      object={property:"Hello World"}
      

      在这种情况下,绑定将完成这项工作。

      如果您希望文本在某些属性更改后更新,您应该将此属性设置为可绑定。

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

      然后声明类MyObject的变量并绑定到它的property

      【讨论】:

        猜你喜欢
        • 2013-03-14
        • 2011-10-03
        • 2020-06-22
        • 1970-01-01
        • 2012-07-08
        相关资源
        最近更新 更多