AS3 - 仅触发一次的事件监听器

Zed*_*d-K 5 events actionscript-3 addeventlistener dispatch

我正在寻找一种方法来添加一个EventListener,它会在第一次触发后自动删除它,但我无法想办法按照我想要的方式执行此操作.

我找到了这个功能(这里):

public class EventUtil
{
    public static function addOnceEventListener(dispatcher:IEventDispatcher,eventType:String,listener:Function):void
    {
         var f:Function = function(e:Event):void
         {
              dispatcher.removeEventListener(eventType,f);
              listener(e);
          }
          dispatcher.addEventListener(eventType,f);
    }
}
Run Code Online (Sandbox Code Playgroud)


但不必写:

EventUtil.addOnceEventListener( dispatcher, eventType, listener );
Run Code Online (Sandbox Code Playgroud)

我想以通常的方式使用它:

dispatcher.addOnceEventListener( eventType, listener );
Run Code Online (Sandbox Code Playgroud)


有没有人知道如何做到这一点?
任何帮助都会非常感激.


(我知道Robert Penner的Signals可以做到这一点,但是我不能使用它们,因为它意味着很多代码重写,我目前的项目无法负担)

Bef*_*rem 11

我发现最简洁的方法是不使用静态或用噪声搞乱你的代码是定义一个全局函数(在一个名为removeListenerWhenFired.as的文件中),如下所示:

package your.package
{
    import flash.events.Event;
    import flash.events.IEventDispatcher;

    public function removeListenerWhenFired(callback:Function, useCapture:Boolean = false):Function
    {
        return function (event:Event):void
        {
            var eventDispatcher:IEventDispatcher = IEventDispatcher(event.target)
            eventDispatcher.removeEventListener(event.type, arguments.callee, useCapture)
            callback(event)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以听这样的事件:

import your.package.removeListenerWhenFired

// ... class definition

    sprite.addEventListener(MouseEvent.CLICKED, 
        removeListenerWhenFired(
            function (event:MouseEvent):void {
                ... do something
            }
        )
    )
Run Code Online (Sandbox Code Playgroud)