论坛首页 编程语言技术论坛

FLEX的ObjectProxy

浏览 3162 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-03-03  
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

参考文献
1.Flex 数据易犯错误: 常见误用和错误. http://www.adobechinadeveloper.com/Newsletter/May10/Essential_the_Articles/databinding_pitfalls_
   发表时间:2011-03-04  
不知道什么情况下用ObjectProxy,什么情况下用ChangeWatcher?
0 请登录后投票
   发表时间:2011-03-07  
ObjectProxy也只能处理你例子中的UserInfo这样的flat类, 不能处理有nested field的类,
详见我的blog文章:  http://www.smithfox.com/?e=96
0 请登录后投票
   发表时间:2011-04-18  
smithfox 写道
ObjectProxy也只能处理你例子中的UserInfo这样的flat类, 不能处理有nested field的类,
详见我的blog文章:  http://www.smithfox.com/?e=96

看了,不错,既然有漏洞,我也就每必要深耕了,我也从没那样写过,我都是用自定义事件派发,或系统事件监听,基本上够用了。
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics