AS3 - прослушиватель событий, который срабатывает только один раз - PullRequest
5 голосов
/ 19 марта 2010

Я ищу способ добавить 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);
    }
}


Но вместо того, чтобы писать:

EventUtil.addOnceEventListener( dispatcher, eventType, listener );

Я бы хотел использовать его обычным способом:

dispatcher.addOnceEventListener( eventType, listener );


Кто-нибудь понял, как это можно сделать?
Любая помощь будет принята с благодарностью.


(я знаю, что Сигналы Роберта Пеннера могут сделать это, но я не могу их использовать, поскольку это будет означать много переписывания кода, который я не могу позволить себе для своего текущего проекта)

Ответы [ 3 ]

11 голосов
/ 22 марта 2010

Я считаю, что самый простой способ без использования статики и не испортить ваш код с шумом - это определить глобальную функцию (в файле с именем 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
            }
        )
    )
2 голосов
/ 19 марта 2010

Я не пробовал, но вы могли бы просто превратить статический метод 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);
1 голос
/ 14 июня 2013
functionadd.addEventListener(COMPLETE,functionremove);

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