Динамическое добавление элементов управления в ActionScriptand Access Правильный экземпляр - PullRequest
1 голос
/ 15 марта 2012

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

Итак, я динамически добавляю кнопки и сетки данных при выполнении цикла 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);
 }

1 Ответ

0 голосов
/ 05 апреля 2012

Имеет все , что связано с замыканиями.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...