Actionscript 3 AS3-仅触发一次的事件侦听器
我正在寻找一种添加EventListener的方法,它会在第一次启动后自动删除自身,但我想不出一种方法来实现这一点 我找到了这个函数():Actionscript 3 AS3-仅触发一次的事件侦听器,actionscript-3,events,addeventlistener,dispatch,Actionscript 3,Events,Addeventlistener,Dispatch,我正在寻找一种添加EventListener的方法,它会在第一次启动后自动删除自身,但我想不出一种方法来实现这一点 我找到了这个函数(): 但是不必写: EventUtil.addOnceEventListener( dispatcher, eventType, listener ); 我想以通常的方式使用它: dispatcher.addOnceEventListener( eventType, listener ); 有人知道怎么做吗? 任何帮助都将非常感激。 (我知道Robert P
但是不必写:
EventUtil.addOnceEventListener( dispatcher, eventType, listener );
我想以通常的方式使用它:
dispatcher.addOnceEventListener( eventType, listener );
有人知道怎么做吗?
任何帮助都将非常感激。
(我知道Robert Penner可以做到这一点,但我不能使用它们,因为这将意味着大量的代码重写,而我目前的项目负担不起)我没有尝试过,但您可以将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);
我发现在不使用静态或不干扰代码的情况下,最干净的方法是定义一个全局函数(在名为RemovelistenerWhenfied.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
}
)
)
我不能使用继承,因为AS3不允许多重继承,而且我的大多数类已经在扩展另一个继承。我想把这个函数放在一个外部的.as文件中,我将把它包含在我所有的类中,但我想知道是否有更好的方法来实现这一点;这可以解决我的问题,但更难看(没问题)闭包确实非常方便。我正在构建一个包含闭包和全局函数技巧的包,看看它将走向何方。既然您添加的侦听器是匿名函数,您将如何手动删除这样的侦听器?如果你不能手动删除它,那么迟早你会发现一个bug。
import your.package.removeListenerWhenFired
// ... class definition
sprite.addEventListener(MouseEvent.CLICKED,
removeListenerWhenFired(
function (event:MouseEvent):void {
... do something
}
)
)
functionadd.addEventListener(COMPLETE,functionremove);
functionremove()
{
runevent();
functionadd.removeEventListener(COMPLETE,functionremove);
}
function runevent()
{
trace('Hello');
}