加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Flex event clone(转)

发布时间:2020-12-15 05:01:05 所属栏目:百科 来源:网络整理
导读:flex事件机制是属于flex的基础知识。如果你使用自定义事件时往往需要复写clone,你是否知道为什么要复写呢? 1.clone方法的作用是什么? 在flash.events.Events基类中就有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,includeTransient:false});
var properties:Array = [];
for each (var qName:QName in info.properties)
{
?????properties.push(qName.localName);
}
转自: http://bbs.airia.cn/home.php?mod=space&uid=133476&do=blog&id=4728

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读