AS3 - Слушатель события, который только стреляет однажды

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


Кто-либо понял то, как это могло быть сделано?
Любая справка была бы значительно apprecitated.


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

,

5
задан Zed-K 19 March 2010 в 13:40
поделиться

2 ответа

Я нахожу, что самый чистый способ без использования статики и беспорядка в коде - это определение глобальной функции (в файле под названием 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
            }
        )
    )
11
ответ дан 18 December 2019 в 13:13
поделиться

Я не пробовал, но вы можете просто превратить статический метод 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
ответ дан 18 December 2019 в 13:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: