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