private var object:Object = {}; private var objectProxy:ObjectProxy; objectProxy = new ObjectProxy(object); objectProxy.addEventListener(PropertyChangeEvent.PROPERTY_CHANGE, updateChange); objectProxy.name = "My Object"; objectProxy.id = 31; //这二个赋值语句不会引发PropertyChangeEvent事件 object.isDebug = false; object.id = 33; //将id从33改成45,并引发PropertyChangeEvent事件 objectProxy.id = 45;
1.ObjectProxy概述
主要是为了监控一个观察对象,当这个观察对象的值发生变化时,由该类派发相应的事件。
如果不是你自己的类,你又希望绑定它,或你只是希望运行时添加绑定功能,你可以使用ObjectProxy类。
ObjectProxy封装一个没有绑定的类并在这个被绑定类的任何属性改变时派发属性改变事件,使得你能监听你程序里的该对象的属性改变。
2.ObjectProxy常见属性和方法
属性
uid : String 此对象的唯一标识符。
方法
addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void
注册事件侦听器对象,以便侦听器能够接收事件通知。
hasEventListener(type:String):Boolean
检查是否该对象及父对象为特定事件类型注册了任何事件侦听器。
willTrigger(type:String):Boolean
检查是否用此对象监听某种类型的事件,与hasEventListener有什么区别?
3.ObjectProxy举例
例1:ObjectProxy监控观察对象UserInfo。接着我添加了一个事件监听,来跟踪UserInfo各项的改变。
UserInfo.as
package { public class UserInfo { public var userName:String="xxx";//如果没有初值,则PropertyChangeEvent 中的oldValue为null public var password:String="123"; public function UserInfo() { } } }
ObjectProxyExam1.mxml
<?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" creationComplete="creationCompleteHandler()" minWidth="955" minHeight="600"> <s:layout> <s:VerticalLayout/> </s:layout> <fx:Declarations> <!-- 将非可视元素(例如服务、值对象)放在此处 --> </fx:Declarations> <fx:Script> <![CDATA[ import mx.events.PropertyChangeEvent; import mx.utils.ObjectProxy; import mx.utils.object_proxy; private var userInfo:UserInfo = new UserInfo(); private var objectProxy:ObjectProxy; protected function creationCompleteHandler():void { objectProxy = new ObjectProxy( userInfo ); objectProxy.addEventListener( PropertyChangeEvent.PROPERTY_CHANGE, onPropertyChange ); //这里不用写userInfo.userName,好象userName就是objectProexy的属性一样 objectProxy.userName = "EladElrom"; //objectProxy.password = "123456"; //与上面赋值效果相同 lb4.text=objectProxy.willTrigger("delete").toString();//没有监听这个事件 lb5.text=objectProxy.willTrigger(PropertyChangeEvent.PROPERTY_CHANGE).toString();//监听了这个事件 lb6.text=objectProxy.hasEventListener(PropertyChangeEvent.PROPERTY_CHANGE).toString();//监听了这个事件 } private function onPropertyChange( event:PropertyChangeEvent ):void{ lb1.text = event.newValue.toString(); lb2.text = event.oldValue.toString(); lb3.text = event.property.toString(); } ]]> </fx:Script> <s:Label id="lb1" /> <s:Label id="lb2" /> <s:Label id="lb3" /> <s:Label id="lb4" /> <s:Label id="lb5" /> <s:Label id="lb6" /> </s:Application>
运行结果
EladElrom
xxx
userName
false
true
true