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