`
smilease
  • 浏览: 88957 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

Flex event clone(转)

    博客分类:
  • Flex
 
阅读更多
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);
}
分享到:
评论

相关推荐

    flex对图片打开,剪切,放大缩小,旋转

    我们可以使用`draw()`方法从`Loader`对象获取`BitmapData`,然后使用`clone()`方法创建一个副本,并应用`copyRect()`或`scrollRect`属性来实现剪切效果。 4. **放大缩小**: 对于缩放,Flex提供了`scaleX`和`...

    flex试题打包面试题挺好的

    - **步骤四**:重写`toString()`和`clone()`方法。 ### 13. 获取运行环境信息 - **示例**:获取操作系统信息。 ```actionscript flash.system.Capabilities.os ``` ### 14. 跨域资源共享策略 - **实现方法**...

    flex事件机制的分发

    - `clone()`:覆盖`Event`的`clone()`方法,用于创建事件的副本。 5. **事件分发**: - `EventDispatcher`是Flex中的事件调度器,负责处理事件的分发。在示例中,`CustomEvent`类使用静态的`EventDispatcher`实例...

    flex 事件学习

    1. **事件定义**:这是创建事件类的过程,例如`MouseEvent.CLICK`或`FlexEvent.UPDATE_COMPLETE`。每个事件类都继承自`flash.events.Event`基类,包含特定于事件的信息,如事件类型和数据。 2. **事件派发**:当...

    Flex 拖拽例子 从不同组件间拖拽

    var dragImage:InteractiveObject = myComponent.clone(); // 设置拖动数据 var data:Object = {source:"myComponent"}; DragManager.doDrag(myComponent, dragImage, data); } ``` 在放置目标组件上,需要...

    flex题目大全

    public override function clone():Event { return new MyCustomEvent(this.type, this.bubbles, this.cancelable); } } ``` #### 20. 不用AS3代码方式能不能自定义一个事件? - **答案**:理论上来说,AS3中...

    Flex文本框数据过滤

    _filteredData = dataSource.clone(); // 如果没有输入,显示全部数据 } else { _filteredData = new ArrayCollection(); for each (var item:Object in dataSource) { if (item.label.indexOf(text) > -1) { /...

    Flex_CookBook_读书笔记(精品)

    自定义事件需要继承`flash.events.Event`类,并覆写`clone()`方法。创建事件监听器时,要注意事件源的存在,比如按钮被激活时才能监听到事件。若想全局监听键盘事件,需在`addedToStage`事件处理函数中添加事件监听...

    flex面试题集

    - 覆盖`toString()`和`clone()`方法以提供更多信息和复制事件对象的能力 13. **检测本机内容**:在Flash Player中,通过`System.capabilities`对象可以获取本机的一些信息,如操作系统、浏览器、屏幕分辨率等。...

    收集的很全面的Flex面试题

    override public function clone():Event { return new MyCustomEvent(this.type, this.bubbles, this.cancelable); } } ``` 使用自定义事件: ```actionscript var myObject:MyObject = new MyObject(); ...

    AS3和Flex一百条常用的知识

    function keyDownHandler(event:KeyboardEvent):void { if (event.keyCode == Keyboard.SPACE) { // 执行动作 } }` 5. **检测碰撞**:使用`hitTestObject`或`hitTestPoint`方法检测两个对象或对象与点的碰撞。例如...

    FLEX 事件机制-自定义事件介绍

    override public function clone():Event { return new MyEvent(MY_EVENT, false, false, data); } override public function toString():String { return formatToString("MyEvent"); } } } ``` 在这个例子...

    Flex 事件分发(FlexViewer事件机制)剥离过程

    它还包含了克隆方法(clone),用于创建事件的副本;以及dispatch方法,用于在事件总线上分发当前事件。AppEvent类还提供了一种静态的dispatch方法,方便直接创建并分发事件实例。 EventBus类是事件总线模式的实现...

    FlexGraphics_V_1.79_D4-XE10.2_Downloadly.ir

    The event now fired before flex-control size setup in TFlexControl.ControlCreate and all changes inside it fall into control creating undo-group. - FIX The current scale ignores in TFlexBox....

    前端大厂最新面试题-2019快看漫画前端社招面经.docx

    为了处理异步操作,JavaScript 引入了事件循环(Event Loop)机制。事件循环包括以下几个关键部分: 1. **调用栈(Call Stack)**:存放函数调用,按照先进后出(LIFO)原则执行。 2. **任务队列(Task Queue)**:...

    jquery div拖动排序效果代码.zip

    helper: "clone" // 在拖动时创建元素的副本 }); }); ``` 为了实现排序功能,我们需要监听`drop`事件,并处理元素的位置变化。同时,还要阻止默认的浏览器行为: ```javascript $("#container").droppable({ ...

    juery1.2.6-jquery1.3.2帮助文档大全+css+js帮助文档大全

    2. **DOM操作**:jQuery提供了丰富的DOM操作API,如`append()`用于向元素内部追加内容,`prepend()`用于在元素内部首部插入内容,`remove()`用于移除元素,`clone()`用于复制元素等。 3. **事件处理**:jQuery简化...

Global site tag (gtag.js) - Google Analytics