Flex event clone(转)

flex事件机制是属于flex的基础知识。如果你使用自定义事件时往往需要复写clone,你是否知道为什么要复写呢?
1.clone方法的作用是什么?
在flash.events.Events基类中就有clone方法,它用来克隆整个事件对象,所谓克隆就是又造出来一个新的对象,并且具有和原事件对象完全一致的值,但是又不同于拷贝,因为克隆后原事件对象与新事件对象具有相同的Uid。这是克隆与拷贝仅有的一个区别,可参看API解释。复写克隆的目的是把自定义的数据写入到克隆后的事件对象中。
2.我需要复写克隆方法吗?
如果你自定义了一个新的事件,并且该事件有自己定义的属性,即该事件对象包含自定义的数据。那么你最好复写clone方法,因为在某些情况下只有复写了clone方法,才能把自定义数据传输出去,在监听回调中才能正确获得自定义的数据。那么是什么情况下不复写clone就不能传递自定义数据呢?
3.clone方法何时会被触发?
当同一个事件对象被两个地方调用时,就会触发调用clone方法,这是flex的机制。比如:var myEvent:MyCustomEvent=new MyCustomEvent();stage.dispatchEvent(myEvent);this.dispatchEvent(myEvent);或者在事件的回调中,把这个事件继续派发了出去,等等。以上情况下将触发clone,如果你没有在自定义事件中复写clone,那么被二次派发的事件对象就没有携带你自定义属性的数据,就会导致运行异常。
4.我可以不复写clone方法吗?
看别人成熟的案例,所有自定义事件都要复写clone,而且克隆方法的内容又是出奇的简单一致,都是new新的事件对象,并把原事件的值赋值到新事件对象。 难道不能定义一个事件基类,在基类中完成clone,把子类的属性都通过遍历依次赋值一遍,子类无需再写那些幼稚的clone吗?我告诉大家,可以!
我编写如下事件基类,实现了为子类clone属性的功能,在此分享:
import flash.events.Event;
import flash.utils.getDefinitionByName;
import flash.utils.getQualifiedClassName; 
import mx.utils.ObjectUtil;
public class MyEvent extends Event
{  
     public function MyEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false)
    {
         super(type, bubbles, cancelable);
    }
  
    override public function clone():Event
    {
         var type:String = getQualifiedClassName(this);
         type = type.replace("::", ".");
 
         var classRefrence:Class ;
         var baseEvent:Event; 
         try
        {
             classRefrence = getDefinitionByName(type) as Class; 
             baseEvent= new classRefrence(this.type) as Event;
        }
        catch(e:Error)
       {
             baseEvent= new classRefrence() as Event;
       }
   
       var info:Object = ObjectUtil.getClassInfo(this, ["alias","dynamic","name"], {includeReadOnly:false,includeTransient:false});
       var properties:Array = [];
       for each (var qName:QName in info.properties)
      {
            properties.push(qName.localName);
      }
      if(!properties){
           for each(var s:String in properties){
                baseEvent[s] = this[s];
           }
      }
      return baseEvent;
}
5.总结
本质上,就是利用了flex的反射机制,根据事件对象对象,反射出事件类来,调用ObjectUtil.getClassInfo获得类信息,进而遍历每个属性并依次赋值。
6.题外话
其实最早提出这个思路的是一位同事,但是他们遇到了一个棘手的问题,就是发现在debug版本下运行正常release后就不正常了,我的贡献在于解决了这个问题。 问题的焦点在于如何获得反射后类的属性,同事原来的方法是info.properties。可是经过我的跟踪发现,在debug版本下info.properties包含类的属性,而在release后就没有properties这个属性了,我也不明白flex为什么会有这个差别,但是真正取类属性的方法应该是如下代码:
var info:Object = ObjectUtil.getClassInfo(this, ["alias","dynamic","name"], {includeReadOnly:false,includeTransient:false});
var properties:Array = [];
for each (var qName:QName in info.properties)
{
     properties.push(qName.localName);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值