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

所以我想要一种设置事件的方式,以便我可以传递数据而不会产生闭包内存泄漏。 这是我所得到的:

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]

我的目标是获取我想要传递的自定义数据,以便从事件闪现中传递,而不仅仅是我触发的事件。 例如,如果我想将一个movieclip和一个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
}

BAM! 您天生派发的活动的自定义数据!


以下显示了创建自定义事件的最简洁方式。 通常,事件类型具有在所有大写字母中键入的公共静态引用。 事件分派时,它将事件或CustomEvent对象传递给事件处理程序方法。 这是您可以检索您传递的值的位置。

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

    public class CustomEvent extends Event 
    {
        public static const VALUE_CHANGED:String = "VALUE_CHANGED";
        public var value:Number;

        public function CustomEvent(pValue:Number) 
        { 
            super(CustomEvent.VALUE_CHANGED);
            value = pValue;
        } 
        public override function clone():Event 
        { 
            return new CustomEvent(value);
        }
    }
}

当我们派发事件时,我们创建了一个新的事件实例来传递。

private var _someValue:int = 12;
dispatchEvent(new CustomEvent(_somevalue));
链接地址: http://www.djcxy.com/p/42505.html

上一篇: How do I modify existing AS3 events so that I can pass data?

下一篇: What application trust level is need for ASP.NET MVC framework?