我有一个奇怪的问题!我试图通过调用一个函数来移除FileReference对象上的事件侦听器,但它似乎没有被删除,我不明白为什么。清除FileReference对象上的eventListeners
下面是代码:
private function clearFileUploadListeners(file:FileReference, index:String):void {
var dispatchEvent:Function = function(event:Event):void {
dispatch(event.type, event, index);
};
file.removeEventListener(Event.COMPLETE, dispatchEvent);
var bool:Boolean = file.hasEventListener(Event.COMPLETE);
if (bool)
trace("ERROR");
}
当我运行这段代码,跟踪实际情况。我不明白为什么这个布尔值返回true,当我刚刚尝试删除上面的eventListener!我想我可能会做一些非常愚蠢的事情,因为它看起来像一个奇怪的错误。
我希望有人能够帮助我解决这个问题。
编辑:
我相信这与该dispatchEvent功能是另一个函数中定义的事实做当我添加监听器:
private function upload(file:FileReference, index:String):void {
var dispatchEvent:Function = function(event:Event):void {
dispatch(event.type, event, index);
};
file.addEventListener(Event.COMPLETE, dispatchEvent);
}
的问题是,我需要访问这个来自侦听器的“index”变量,并且我无法将其设置为全局变量,因为每个文件都有自己的索引,并且如果必须扩展每个事件类以跟踪索引(Event,ProgressEvent,。 )。我希望有人能够帮助我。
EDIT2:
我居然发现一个临时的解决方案,我不知道这是否是最好的!我把我的removeListener方法实际上放在上传方法中,但是把它变成了一个变量。由于AS3允许动态对象,因此我将此方法附加到我的一个对象上,因此我只需在必要时调用该方法的引用。事件实际上已被删除。请问这是一个好的解决方案吗?
非常感谢你, 鲁迪
非常感谢,超清晰的解释,我明白了。我喜欢你的解决方案,它非常接近我的想法(我在上传函数中定义了一个removeListeners()函数,并将其存储到一个对象中)。 IE:object.var = removeListeners;那么object.var();它与你的相似,我不必费心跟踪字典,而是使用堆栈。谢谢你的帮助! – Rudy 2010-06-17 16:21:43
很高兴有帮助:-) – Cameron 2010-06-18 01:11:35