Имена и идентификаторы компонентов во Flex и Actionscript, откуда они берутся? - PullRequest
1 голос
/ 26 августа 2009

Для иллюстрации моего вопроса. Предположим следующий фрагмент кода:

<?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 ... в этом случае каждый раз разделенный на 4?

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

1 Ответ

4 голосов
/ 26 августа 2009

Не забывайте, что поскольку 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;
}

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

...