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

时间:2010-03-19 10:14:04

标签: actionscript-3 events addeventlistener dispatch

我正在寻找一种方法来添加一个EventListener,它会在第一次触发后自动删除,但我无法按照我想要的方式做到这一点。

我找到了这个函数(here):

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);
    }
}


但不必写:

EventUtil.addOnceEventListener( dispatcher, eventType, listener );

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

dispatcher.addOnceEventListener( eventType, listener );


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

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

3 个答案:

答案 0 :(得分: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)
        }
    }
}

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

import your.package.removeListenerWhenFired

// ... class definition

    sprite.addEventListener(MouseEvent.CLICKED, 
        removeListenerWhenFired(
            function (event:MouseEvent):void {
                ... do something
            }
        )
    )

答案 1 :(得分:2)

我没有尝试过,但您可以将EventUtil静态方法转换为标准方法并在对象中扩展该类。

public class OnceEventDispatcher
{
    public function addOnceEventListener(eventType:String,listener:Function):void
    {
         var f:Function = function(e:Event):void
         {
              this.removeEventListener(eventType,f);
              listener(e);
          }
          this.addEventListener(eventType,f);
    }
}

public class Example extends OnceEventDispatcher
{


}

var ex:Example = new Example();
ex.addOnceEventListener(type, func);

答案 2 :(得分:1)

functionadd.addEventListener(COMPLETE,functionremove);

functionremove()
{
    runevent();
    functionadd.removeEventListener(COMPLETE,functionremove);
}
function runevent()
{
   trace('Hello');
}