2012-09-11 59 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明白这更好的解决方案。