2012-09-11 55 views
2

我很努力地傳遞參數在onComplete事件處理函數上運行。將參數傳遞給addEventListener AS3

看來,我的問題是與event.Complete代碼..

我只是想從一個URL和傳輸參數加載圖像。

這是我的代碼:

var imageURLRequest:URLRequest = new URLRequest(pic); 
var myImageLoader:Loader = new Loader(); 
myImageLoader.load(imageURLRequest); 

myImageLoader.contentLoaderInfo.addEventListener(Event.COMPLETE,function(evt:Event.COMPLETE){ 
    doIt(evt, "Shift key was down:") 
},false,0, true); 

function doIt(evt:Event, msg:String) { 
    var myBitmapData:BitmapData = new BitmapData(myImageLoader.width, myImageLoader.height); 
    myBitmapData.draw(myImageLoader); 
    var myBitmap:Bitmap = new Bitmap; 
    myBitmap.bitmapData = myBitmapData; 
} 

非常感謝你。從處理器內部函數

+0

究竟是什麼問題? –

+0

他並沒有真正在他的處理程序中聽到「事件」。 – Gio

回答

2

刪除.COMPLETE,使您的聽衆是這樣的:

myImageLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, function(evt:Event) 
{ 
    doIt(evt, "Shift key was down:") 
} , false, 0, true); 
+1

嘗試從封閉外部移除該監聽器,則不能。這可能導致內存泄漏,所以我建議不要使用這個。只需在本地存儲您需要的數據或查看event.target或event.currentarget(來自普通事件處理程序)可以爲您提供什麼。 –

+0

我同意你的看法,但在這種情況下,你在關閉後不需要該監聽器。他也想知道爲什麼它不起作用。雖然我也建議Jevgenij的答案是更好的整體結果和實踐。這就是我投票的原因。編輯:他也在這裏使用弱引用,所以它不應該是一個問題。 – Gio

2

看那Loader類的加載器,而不是DisplayObject即使是:

var myBitmap:Bitmap; 
var contentLoader:Loader = new Loader(); 
contentLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, handleComplete); 
contentLoader.load(imageURLRequest); 

function handleComplete(e:Event):void 
{ 
    myBitmap = contentLoader.content as Bitmap; 
} 
2

首先,因爲Gio表示,從evt:Event.COMPLETE中刪除.COMPLETE,因爲它返回的是String而不是函數所需的Event。

然後,而不是設置,上絲毫不馬虎不可預知的參數(useWeakReference),以trueaddEventListener(),我建議你保持一個變量來在正確的時間上它使用removeEventListener()參考。一種方法可以做到這一點(而回答你的問題)是:

var imageURLRequest:URLRequest = new URLRequest(pic); 
var myImageLoader:Loader = new Loader(); 
myImageLoader.load(imageURLRequest); 

var functionDoIt:Function = doIt("Shift key was down:"); 
myImageLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, functionDoIt); 

function doIt(msg:String):Function { 
    return function(evt:Event):void { 
    // Now you can use both "msg" and "evt" here 
    var myBitmapData:BitmapData = new BitmapData(myImageLoader.width, myImageLoader.height); 
    myBitmapData.draw(myImageLoader); 
    var myBitmap:Bitmap = new Bitmap(myBitmapData); 
    } 
} 

// Remove the listener when you don't need it anymore: 
//myImageLoader.contentLoaderInfo.removeEventListener(Event.COMPLETE, functionDoIt); 

您可以通過閱讀this answer明白這更好的解決方案。