2012-03-15 101 views
1

我的問題在於,我試圖準確理解這段代碼是如何編寫的。這就是我需要的,但不確定幕後到底發生了什麼。任何ActionScript Pro都可以幫助嗎?動態添加控件在ActionScriptand訪問正確的實例

所以,我正在做的是動態添加按鈕和數據網格,而迭代通過for循環。該按鈕通過將visible屬性設置爲false並從佈局中移除畫布來控制包含數據網格的畫布的可見性。

如果我創建了一個添加按鈕和設置可見屬性的事件偵聽器的函數,則該按鈕將與正確的畫布相關聯。如果我不在函數中添加按鈕和事件偵聽器,則所有按鈕控制for循環中添加的最後一個畫布。

這是否與閉包有關?見下面的代碼。

這個工程:

for(var j:int = 0; j < resultsArray.length; j++) 
{  
    var dataGridCanvas:Canvas = new Canvas(); 
    dataGridCanvas.top = 5; 

    var vboxDatagrid:VBox = new VBox(); 
    var vboxButton:VBox = new VBox(); 

    var resultsAttributeDataGrid:DataGrid = new DataGrid(); 

    vboxButton.addChild(addButtonToCanvas(identifyResults[0], dataGridCanvas)); 

    sidePanel.idResults.vbxIdToolIResults.addChild(vboxButton); 

    var vboxDataGridChild:VBox = new VBox(); 

    vboxDataGridChild.addChild(resultsAttributeDataGrid); 

    vboxDatagrid.addChild(vboxDataGridChild); 

    dataGridCanvas.addChild(vboxDatagrid); 

    idResults.vbxIdToolIResults.addChild(dataGridCanvas); 
} 

private function addButtonToCanvas(layerName:String, theCanvas:Canvas):VBox 
{ 
    var vbox:VBox = new VBox(); 

    var layerButton:spark.components.Button = new spark.components.Button(); 
      layerButton.label = layerName as String; 

      layerButton.addEventListener(MouseEvent.CLICK, 
       function onClick():void{ 
        theCanvas.visible == true ?   theCanvas.visible = false : theCanvas.visible = true; 
        theCanvas.visible == false ? theCanvas.includeInLayout = false : theCanvas.includeInLayout = true 
       }); 

    vbox.addChild(layerButton); 

     return vbox; 
} 

這並不工作,但在做同樣的事情 - 添加一個按鈕,它的事件監聽到VBOX:

for(var j:int = 0; j < resultsArray.length; j++) 
{  
    var dataGridCanvas:Canvas = new Canvas(); 
    dataGridCanvas.top = 5; 

    var vboxDatagrid:VBox = new VBox(); 
    var vboxButton:VBox = new VBox(); 

    var resultsAttributeDataGrid:DataGrid = new DataGrid(); 

    var vbox:VBox = new VBox(); 

    var layerButton:spark.components.Button = new spark.components.Button(); 

    layerButton.label = layerName as String; 

    layerButton.addEventListener(MouseEvent.CLICK, 
       function onClick():void{ 
        dataGridCanvas.visible == true ?    dataGridCanvas.visible = false : dataGridCanvas.visible = true; 
        dataGridCanvas.visible == false ? dataGridCanvas.includeInLayout = false : dataGridCanvas.includeInLayout = true 
       }); 

    vbox.addChild(layerButton); 

    sidePanel.idResults.vbxIdToolIResults.addChild(vbox); 

    var vboxDataGridChild:VBox = new VBox(); 

    vboxDataGridChild.addChild(resultsAttributeDataGrid); 

    vboxDatagrid.addChild(vboxDataGridChild); 

    dataGridCanvas.addChild(vboxDatagrid); 

    idResults.vbxIdToolIResults.addChild(dataGridCanvas); 
} 

回答

0

一切到做關閉。

當您在第一個示例中將畫布傳遞給addButtonToCanvas時,閉包將使其與onClick處理程序保持關聯。