如何在将Flex组件添加到显示之前对其进行内省

时间:2009-08-24 20:26:23

标签: flex components

假设您有一个MyView.mxml文件,它基本上是一个Panel  几个孩子(Form,FormItems,Buttons ......)。

是否可以迭代MyView并获取有关的所有信息  它的子项(类型,id ...)在显示之前。

在我的Main.mxml中,如果我有这个功能

    public function iterateOverChildren(comp:Container):void {
        // Get the number of descriptors.
        trace("Running iterateOverChildren for " + comp.id);
        if (comp != null)
        {
        var n:int = comp.childDescriptors.length;
        for (var i:int = 0; i < n; i++) {
            var c:ComponentDescriptor = comp.childDescriptors[i];
            var d:Object = c.properties;

            // Log ids and types of objects in the Array.
            trace(c.id + " is of type " + c.type);

            // Log the properties added in the MXML tag of the object.
            for (var p:String in d) {
                trace("Property: " + p + " : " + d[p]);
            }
        }
        }
    }

为什么这个电话不起作用?

var myV = MyView();  iterateOverChildren(MYV);

只有添加类似的语句才有效  的addChild(MYV);  在iterateOverChildren调用之前。 (但这不是我想要的,我想  迭代描述而不将其添加到显示中。)

当我读到这篇文章时 http://livedocs.adobe.com/flex/3/html/help.html?content=layoutperformance_06.html

我认为“childDescriptors”方法独立于生命周期,它会让我在不添加显示的情况下反省组件。我错过了什么 ?如何在显示之前内省组件。

1 个答案:

答案 0 :(得分:2)

Flex中有多种组件实例化方法。

如果在ActionScript中使用构造函数,则会获得一个裸金属对象,其中只有对象本身的构造已经完成。特别是,这个新对象尚未实例化其子视图,这就是为什么在查看getChildren()的结果时看不到任何内容的原因。

如果在MXML中记下组件,MXML编译器会创建ComponentDescriptors而不是“真实”对象。它们包含您在MXML中为对象指定的所有信息(属性,绑定,事件处理程序等),运行时使用它们在适当的时间创建实际对象。 “适当的时间”通常表示“当对象被添加到显示列表时”。这就是为什么你在调用addChild()之后才看到孩子的原因(技术上,不是在调用addChild()之后立即看到的,而是仅在新实例化的对象调度了creationComplete事件之后)。