【问题标题】:AS3 removing event listenersAS3 移除事件监听器
【发布时间】:2023-09-26 10:27:01
【问题描述】:

我有一个关于在 actionscript 3 中手动删除事件侦听器的基本问题。

如果我有这样的功能:

    private function doStuff(event : Event):void
    {

        //let them save
        var f:FileReference = new FileReference();
        f.addEventListener(Event.COMPLETE,saveDone);
        f.save(mp3Encoder.mp3Data,"output.mp3");

    }

如何在调用 saveDone 函数时删除事件侦听器?通常我只是将“添加”更改为“删除”,例如:

f.removeEventListener(Event.COMPLETE,saveDone);

但是,f是一个局部变量,doStuff函数结束后我无法获取它。

    private function saveDone(ev:Event){
        f.removeEventListener(Event.COMPLETE,saveDone);
    }

【问题讨论】:

    标签: flash actionscript-3 event-handling addeventlistener


    【解决方案1】:

    也许尝试通过事件的“目标”属性引用原始对象?我还没有尝试过,但类似于:

    private function saveDone(ev:Event){
    var originalFR:FileReference = ev.target as FileReference;    
    originalFR.removeEventListener(Event.COMPLETE, saveDone);
    }
    

    但我可能完全不在了。

    【讨论】:

      【解决方案2】:

      更好的选择是将FileReference 声明为成员变量并在构造函数中添加EventHandler。您可以删除析构函数中的所有EventHandlers

      【讨论】:

      • 谢谢您的意见。我一直在这样做,但不知道哪个更好。我知道我不擅长 flash 和 AS3,但无论哪种方式,我的代码看起来都很乱。大量仅用于发生事件的成员变量变得令人困惑。
      【解决方案3】:

      添加弱引用也是一个很好的备份,这样当没有指向它的引用时,侦听器会被删除并自动收集垃圾。

      f.addEventListener(Event.COMPLETE,saveDone,false,0,true);
      

      不过,最好还是手动移除监听器。

      【讨论】: