我有一個奇怪的問題!我試圖通過調用一個函數來移除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