2009-08-26 2 views
1

Чтобы проиллюстрировать мой вопрос. Предположим, следующий фрагмент кода:Имена компонентов и идентификаторы в Flex и ActionScript, откуда они взяты?

<?xml version="1.0" encoding="utf-8"?> 
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"> 

<mx:Script> 
    <![CDATA[ 
     import mx.controls.Button; 

     private function createButton():void 
     { 
      var myButton:Button = new Button(); 
      myButton.label = "Foo"; 
      this.btncontainer.addChild(myButton); 
      trace ("New Button Created [" + myButton.toString() + "]"); 
     }  
    ]]> 
</mx:Script> 

<mx:Button label="Create Button" click="createButton()" /> 
<mx:VBox id="btncontainer" /> 

</mx:Application> 

Поведение этого сценария должно быть очевидным. Каждый щелчок кнопки «Создать кнопку» генерирует новую кнопку с меткой «Foo». Что делает код и почему он это делает, имеет смысл для меня. Мой вопрос - о выходе консоли. Когда я запустить приложение в режиме отладки и нажмите кнопку «Создать кнопку» четыре раза я получаю следующее в моей консоли:

New Button Created [main0.btncontainer.Button15] 
New Button Created [main0.btncontainer.Button19] 
New Button Created [main0.btncontainer.Button23] 
New Button Created [main0.btncontainer.Button27] 

Мой вопрос где же номер добавляется к имени объекта взялся? например Button15, 19, 23, 27 ... и т. Д.? Есть ли какой-то массив в фоновом режиме, который содержит объекты, и это значение индекса? Это какой-то внутренний счетчик? Это какое-то значение указателя? В моих тестах, по крайней мере, почему, кажется, всегда следует один и тот же шаблон 15, 19, 23, 27 ... каждый раз в этом случае?

Я понимаю концептуально, что здесь происходит. Новый объект Button генерируется и выделяется память. Каждый раз, когда я нажимаю кнопку «Создать кнопку», я создаю новый экземпляр класса Button и добавляю его как дочерний объект VBox. Мне было просто любопытно, каково значение или значение номеров, добавленных к объектам по мере их создания?

ответ

4

Не забывайте, что поскольку Flex является открытым исходным кодом, вы можете отслеживать эту вещь в коде.

Я нашел функцию под названием NameUtil.displayObjectToString, которая, как представляется, отвечает за создание имени для печати экземпляра Flex. Существует также NameUtil.createUniqueName, который создает свойство name.

Посмотрите на код, но в основном createUniqueName разделяет getQualifiedClassName, чтобы получить только имя класса без деталей пакета. NameUtil имеет статический счетчик, который затем добавляет к концу этого имени. поэтому Button15 - это 15-й FlexSprite, созданный вашим приложением.

displayObjectToString не является более сложным, за исключением того, что он следует цепочке компонентов через родителей, присоединяющихся к именам на «.».


Одна вещь, чтобы отметить это комментарий в UIComponent.as:

/** 
* ID of the component. This value becomes the instance name of the object 
* and should not contain any white space or special characters. Each component 
* throughout an application should have a unique id. 
* 
* <p>If your application is going to be tested by third party tools, give each component 
* a meaningful id. Testing tools use ids to represent the control in their scripts and 
* having a meaningful name can make scripts more readable. For example, set the 
* value of a button to submit_button rather than b1 or button1.</p> 
*/ 
public function get id():String 
{ 
    return _id; 
} 

Он говорит: «Это значение становится именем экземпляра объекта», и, хотя это, кажется, правда, я не могу найти out где присваивается идентификатор от имени. Он может быть в коде AS3, который генерируется из MXML, когда он преобразуется во время компиляции.

+0

Спасибо Джеймсу за ответ. –

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