一种在调度时删除侦听器的方法

时间:2013-07-15 12:00:05

标签: actionscript-3

我发现addEventListener方法有点受限。我想使用它的另一个版本,由我制作。我想插入一个参数来判断是否可以自动删除调度的事件,这样就可以避免我在任何地方写这个:

obj.addEventListener(Click, function onClick(e:Event):void {
    obj.removeEventListener(Click, onClick); // <--- I want to avoid this
});

然后:

obj.addEventListener(Click, function onClick(e:Event):void {
    // no need anymore.
}, true); // <--- see

我可以采取什么方法来实现这一目标?

2 个答案:

答案 0 :(得分:1)

使用覆盖 关闭,您始终可以拦截 addEventListener方法调用:

    override public function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void 
    {
        var self = this;
        var weakListener:Function = function(e) {
            self.removeEventListener(type, weakListener);
            listener(e);
        }
        super.addEventListener(type, weakListener, useCapture, priority, useWeakReference);
    }

答案 1 :(得分:0)

允许匿名函数的快速且相当简单的解决方案是arguments.callee属性

obj.addEventListener(Event.WHATEVER, function(e:Event)
{
    e.currentTarget.removeEventListener(Event.WHATEVER, arguments.callee);
    //Do your stuff
}

这会同时创建事件监听器和监听功能,在remove监听器中,它使用arguments.callee引用被调用的函数,允许它自行删除。