2011-11-25 333 views
2

AS绑定到对象属性

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

MXML

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

的标签文本将是 “财产”,但如果object.property改变时,标签将不会被更新。有没有办法解决?

回答

4

除非实施,否则对象或集合的属性不会派发属性更改事件。

与你的例子类似,对数组元素的改变不会被绑定。

诸如ArrayCollection之类的集合包装代理中的对象以分派绑定事件。

使用ObjectProxy将更改分派给您的对象。

实例化一个ObjectProxy和听的PropertyChangeEvent:

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

通过代理访问你的对象,比如设置一个名为“财产”属性:

objectProxy.property = "Hello, world"; 

这个例子与创建一个ObjectProxy定时器每秒更改“属性”成员:

<?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

你绑定到对象本身。这意味着,只有在对象的引用被改变时,标签的文本才会改变。

object={property:"Hello World"} 

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

如果您希望文本在更改某些属性后进行更新,则应该使该属性为Bindable。

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

然后声明MyObject类的变量和结合其property