Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 AS3-仅触发一次的事件侦听器_Actionscript 3_Events_Addeventlistener_Dispatch - Fatal编程技术网

Actionscript 3 AS3-仅触发一次的事件侦听器

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

我正在寻找一种添加EventListener的方法,它会在第一次启动后自动删除自身,但我想不出一种方法来实现这一点

我找到了这个函数():


但是不必写:

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