2011-12-22 118 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); 
}