Flex和Actionscript中的组件名称和ID,它们来自哪里?

时间:2009-08-26 10:18:15

标签: actionscript-3 flex flex3 flex-builder-3

说明我的问题。假设以下代码段:

<?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 个答案:

答案 0 :(得分: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;
}

它说:“这个值成为对象的实例名称”,虽然看起来是真的但我找不到 where 从id到name的赋值发生。它可以在编译期间转换时从MXML生成的AS3代码中。