我有一个关于在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);
}
答案 0 :(得分:5)
也许尝试通过事件的“目标”属性引用原始对象?我没有尝试过,但类似于:
private function saveDone(ev:Event){
var originalFR:FileReference = ev.target as FileReference;
originalFR.removeEventListener(Event.COMPLETE, saveDone);
}
但我可能完全离开了。
答案 1 :(得分:2)
更好的选择是将FileReference
声明为成员变量,并在构造函数中添加EventHandler
。您可以删除析构函数中的所有EventHandlers
。
答案 2 :(得分:0)
添加弱引用也是一个很好的备份,以便在没有引用指向它的情况下删除侦听器并自动收集垃圾。
f.addEventListener(Event.COMPLETE,saveDone,false,0,true);
但是,最好确保手动删除监听器。