actionscript-3 - 如何修改现有的 AS3 事件以便我可以传递数据?

标签 actionscript-3 events listener observer-pattern

所以我想要一种设置事件的方法,以便我可以在不创建闭包\内存泄漏的情况下传递数据。这是据我所知:

package com.events {
    import flash.events.Event;

    public class CustomEvent extends Event {
        public static const REMOVED_FROM_STAGE:String = "removedFromStage";
        public var data:*;

        public function CustomEvent(type:String, customData:*=null, bubbles:Boolean=false, cancelable:Boolean=false) {
            super(type, bubbles, cancelable);
            this.data = customData;
        }

        public override function clone():Event {
            return new CustomEvent(type, data, bubbles, cancelable);
        }

        public override function toString():String {
            return formatToString("CustomEvent", "type", "data", "bubbles", "cancelable", "eventPhase");
        }
    }
}

这让我有以下行为:
function testme(e:Event) {
    trace(e); 
}

test_mc.addEventListener(CustomEvent.REMOVED_FROM_STAGE, testme);
test_mc.dispatchEvent(new CustomEvent(CustomEvent.REMOVED_FROM_STAGE, 42));
//Traces [CustomEvent type="removedFromStage" data=42 bubbles=false cancelable=false eventPhase=2]
removeChild(test_mc);
//Traces [Event type="removedFromStage" bubbles=false cancelable=false eventPhase=2]

我的目标是获取我想要传递的自定义数据,以便从事件 Flash 触发中传递,而不仅仅是我触发的数据。例如,如果我想传递一个影片剪辑和一个 loader.COMPLETE 事件来放入生成的位图怎么办?

最佳答案

您扩展了 Event 类以使其使用额外数据进行调度,现在如果您希望 Loader 类调度您的自定义事件类型,请扩展 Loader 类来执行此操作(或您想要使用的任何其他类)。在这个例子中,我将用这个功能覆盖 URLLoader(因为 Loader 实际上从它的 contentLoaderInfo 调度事件,它需要两个被覆盖的类,我只想保持简单)


package com.net
{
    import flash.net.URLLoader;
    import flash.events.Event;

    import com.events.CustomEvent;

    public class CustomLoader extends URLLoader
    {
        // URLLoader already has a data property, so I used extraData
        public var extraData:*;

        override public function dispatchEvent(event: Event) : Boolean
        {
            var customEvent: CustomEvent = new CustomEvent(event.type, extraData, event.bubbles, event.cancelable);
            return super.dispatchEvent(customEvent);
        }
    }
}

现在要将它与您的 CustomEvent 类一起使用,请在您的 .fla 中尝试此代码

import com.net.CustomLoader;
import com.events.CustomEvent;

var loader: CustomLoader = new CustomLoader();
loader.extraData = "Extra Data";
loader.load(new URLRequest("test.xml"));
loader.addEventListener(Event.COMPLETE, loadComplete);

function loadComplete(event: CustomEvent) : void
{
    trace(event.data); // Extra Data
}

砰!有关您天生调度的事件的自定义数据!

关于actionscript-3 - 如何修改现有的 AS3 事件以便我可以传递数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/758322/

相关文章:

flash - Actionscript 3 - 完全移除一个 child

java - 从浮点读取字节(Javascript)

java - 当用户点击 "Delete data"Android 时如何执行我的应用程序方法

c++ - 监听器类继承者 - 对监听类的 const 或非常量引用?

Java Swing : keeping the event handling maintanable

java - 如何获取Android ListView中imageView的位置

javascript - 我应该学习 Flash/Flex/ActionScript 还是 HTML/CSS/JS ("HTML5")?

apache-flex - 我怎样才能让我的 AS3/Air 代码更好?

javascript - 在没有窗口对象的情况下正确记录 JavaScript 中的按键事件

java - 带有事件的警报对话框错误