我在AS3中编写内联函数作为Loader类的事件处理程序,我遇到的问题是,在这个内联函数中,它需要访问函数范围之外的变量。
这是我运行的代码:
for(var i:uint=0;i<numChildren;i++){;
var displayObj:DisplayObject = getChildAt(i);
var displayObjWidth = displayObj.width;
if (elementname == displayObj.name)
{
var loader:Loader = new Loader();
var urlRequest:URLRequest = new URLRequest(loadURL);
loader.load( urlRequest );
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, function(e:Event){
var mw:Number = displayObj.width;
var mh:Number = displayObj.height;
var tempImage:Bitmap = new Bitmap(e.target.content.bitmapData);
image.bitmapData = tempImage.bitmapData;
image.width = mw;
image.height = mh;
loader.width = displayObj.width;
loader.height = displayObj.height;});
loader.x = displayObj.x;
loader.y = displayObj.y;
addChild( loader );
removeChild( displayObj );
}
此函数正在从URL加载图像,然后查找匹配子元素并将现有图像替换为已加载的新图像。
我遇到的问题是能够访问原始显示对象的高度和宽度,我将替换为通过Loader类加载的新显示对象。
如何在函数范围之外访问这些变量或将它们传递给函数?
答案 0 :(得分:3)
首先,为了省去一些麻烦,你应该将事件处理程序放在一个单独的非匿名函数中,否则会发生各种范围问题。
其次,您可以使用字典来创建所需的图像/显示对象关系。基本上,当您创建加载器时,将其作为键保存在字典中,并将displayObj保存为值。
这样的事情应该有效:
private var imageToDisplayObj:Dictionary = new Dictionary();
function loader_complete(e:Event){
var displayObject:* = imageToDisplayObj[event.currentTarget];
// Do something with the display object
});
for(var i:uint=0;i<numChildren;i++){;
var displayObj:DisplayObject = getChildAt(i);
var displayObjWidth = displayObj.width;
if (elementname == displayObj.name)
{
var loader:Loader = new Loader();
var urlRequest:URLRequest = new URLRequest(loadURL);
loader.load( urlRequest );
// Map the loader to the display object
imageToDisplayObj[loader] = displayObj;
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loader_complete);
loader.x = displayObj.x;
loader.y = displayObj.y;
addChild( loader );
removeChild( displayObj );
}