2012-03-15 2 views
1

Мой вопрос здесь, я пытаюсь понять, как работает этот фрагмент кода, который я написал. Это делает то, что мне нужно, но не совсем точно, что происходит за кулисами. Может ли любой ActionScript Pro помочь?Динамическое добавление элементов управления в ActionScript и доступ Правильный экземпляр

Итак, что я делаю, это динамически добавлять кнопки и datagrids, итерации через цикл for. Кнопка управляет видимостью холста, содержащего datagrid, устанавливая свойство 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

Он имеет все к делать с закрытием.

Когда вы передаете Canvas в addButtonToCanvas в первом примере, закрытие связывает его с обработчиком onClick.

Смежные вопросы