5

初めて起動した後に自動的に削除される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 );


誰かがこれがどのように行われることができるかについての考えを持っていますか?
どんな助けでも大いに感謝されるでしょう。


(Robert PennerのSignalsがこれを実行できることは知っていますが、現在のプロジェクトでは余裕がない多くのコードの書き換えを意味するため、使用できません)

4

3 に答える 3

11

スタティックを使用したり、コードをノイズで混乱させたりせずに、次のようにグローバル関数を(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
            }
        )
    )
于 2010-03-22T16:59:14.680 に答える
2

私は試していませんが、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);
于 2010-03-19T13:45:27.690 に答える
1
functionadd.addEventListener(COMPLETE,functionremove);

functionremove()
{
    runevent();
    functionadd.removeEventListener(COMPLETE,functionremove);
}
function runevent()
{
   trace('Hello');
}
于 2013-06-14T06:02:15.273 に答える