有没有办法更容易删除听众?

时间:2013-02-14 18:09:50

标签: actionscript-3 flash actionscript event-listener

所以,有一种简单的方法可以从像

这样的容器中删除所有孩子
while (container.numChildren)
{
    container.removeChildAt(0);
}

有没有办法删除复数的stage.eventListener(不知道我是否使用右词),像stage.eventListeners?类似的东西?

谢谢!

4 个答案:

答案 0 :(得分:3)

不,没有。没有机制,至少是公开可用的,跟踪事件监听器。但是,你可以自己做。

基本上,您需要跟踪添加的每个侦听器。最简单的方法是扩展您要执行此操作的类并覆盖addEventListener()

private var listeners:Vector.<Object>;

override public function addEventListener( type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false ):void {
    var obj:Object = {
        type : type,
        listener : listener
    };
    this.listeners.push( obj );
    super.addEventListener( type, listener, useCapture, priority, useWeakReference );
}

override public function removeEventListener( type:String, listener:Function, useCapture:Boolean = false ):void {
    var i:Number, l:Number;
    l = this.listeners.length;

    for ( i = 0; i < l; i++ ) {
        if ( this.listeners[i].type == type && this.listeners[i].listener == listener ) {
            this.listeners.splice( i, 1 );
            break;
        }
    }

    super.removeEventListener( type, listener, useCapture );
}

public function removeAllEventListeners():void {
    var i:Number, l:Number;
    l = this.listeners.length;

    for ( i = 0; i < l; i++ ) {
        super.removeEventListener( this.listeners[i].type, this.listeners[i].listener );
    }
    this.listeners.splice( 0, this.listeners.length ); //empties the vector
}

如果扩展某个类不适合您(因为您使用的是带有时间轴的Flash Pro,或者它是您需要从中删除所有事件侦听器的阶段),您可以在每次使用时手动将其添加到Vector中添加一个事件监听器。它不像我上面描述的那样简单,但它仍然可以工作。

请注意,您应该将useCapture属性添加到正在保存的对象中并检查它,但我老实说从未将该属性设置为除默认值之外的任何属性,因此我没有将其包含在我的代码

答案 1 :(得分:0)

在FlashPlayer 11中,DisplayObjectContainer支持删除所有子项的removeChildren函数。因此,您可以使用container.removeChildren()

替换while循环

至于删除所有eventListeners,没有内置的方法。但是,您可以自己编写一些内容来跟踪添加到特定对象的所有侦听器,允许您通过循环遍历集合来删除它们。

答案 2 :(得分:0)

不幸的是,简短的回答是,这是不可能的。默认情况下,事件调度程序不会公开跟踪注册的侦听器。因此,您无法遍历某些列表并将其全部删除。

您必须记住自己添加的听众。

答案 3 :(得分:0)

有一个非常简单的解决方案,Robert Penner的非凡信号库。这是一个例子:

import org.osflash.signal.Signal;

public class Rocket()
{
    //  Signals are used to dispatch messages to interested parties
    public var enginesFiredSignal:Signal;
    public function Rocket()
    {
        //  You have to instantiate the signal for it to do anything
        enginesFiredSignal = new Signal();
    }

    public function fireEngines():void
    {
        //  Dispatch will notify any interested parties
        enginesFiredSignal.dispatch();
    }

    public function dispose():void
    {
        //  This is the magic call... it removes *all* interested parties.
        //  No need to iterate through them and removeEventListeners.
        enginesFiredSignal.removeAll();
    }
}

public class Academy()
{
    public var rocket:Rocket;
    public function Academy()
    {
        rocket = new Rocket();
        //  We are interested to know *when* the engines fire,
        //  so we "add" ourself to the Signal.
        rocket.enginesFiredSignal.add( enginesFiredHandler );
        //  This call will force the Signal to do its thing
        rocket.fireEngines();
        //  Disposing of the Rocket will automatically remove us from
        //  its Signal. No further event removal or maintenance required.
        rocket.dispose();
    }

    public function enginesFiredHandler():void
    {
        trace( "engines were fired" );
    }
}

你可以在方式之外进行参数传递和各种有趣的事情。我建议你看看他的博客。

http://flashblog.robertpenner.com

以下是如何开始使用AS3信号的教程:

http://www.youtube.com/watch?v=wB_sWJ5EgXI