编写内联as3函数并且在访问函数之外的变量时遇到问题

时间:2011-12-22 13:32:24

标签: actionscript-3 actionscript inline-code

我在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类加载的新显示对象。

如何在函数范围之外访问这些变量或将它们传递给函数?

1 个答案:

答案 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 );
}