假设您有一个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”方法独立于生命周期,它会让我在不添加显示的情况下反省组件。我错过了什么 ?如何在显示之前内省组件。
答案 0 :(得分:2)
Flex中有多种组件实例化方法。
如果在ActionScript中使用构造函数,则会获得一个裸金属对象,其中只有对象本身的构造已经完成。特别是,这个新对象尚未实例化其子视图,这就是为什么在查看getChildren()
的结果时看不到任何内容的原因。
如果在MXML中记下组件,MXML编译器会创建ComponentDescriptors而不是“真实”对象。它们包含您在MXML中为对象指定的所有信息(属性,绑定,事件处理程序等),运行时使用它们在适当的时间创建实际对象。 “适当的时间”通常表示“当对象被添加到显示列表时”。这就是为什么你在调用addChild()
之后才看到孩子的原因(技术上,不是在调用addChild()之后立即看到的,而是仅在新实例化的对象调度了creationComplete事件之后)。