2011-12-22 121 views
0

我正在AS3中编写一个内联函数,作为Loader类的事件处理程序,我遇到的问题是在此内联函数中需要访问外部变量函数的范围。编写一个内联as3函数,并且访问函数之外的变量时遇到问题

下面的代码我运行:

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类加载的新显示对象进行替换。

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

回答

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