从另一个访问一个mxml的组件ID

时间:2009-09-21 13:54:23

标签: flex

我有两个mxml文件。一个是主应用程序标签mxml文件,另一个是我的mxml组件文件。 我的主mxml中有一个viewstack,其id为“mainViewStack”。 现在我想从我的mxml组件文件中设置“mainViewStack”的selectedChild属性。 但我得到错误: 错误#1009:无法访问空对象引用的属性或方法。  访问mainObj.mainViewStack.selectedChild.id,其中mainObj是主mxml文件的对象。 请帮帮我。 谢谢你。

4 个答案:

答案 0 :(得分:2)

我的猜测是你在创建孩子之前试图访问它。但是没有代码就很难说清楚。

尝试等待应用程序上的FlexEvent.CREATION_COMPLETE事件访问所选子项。

答案 1 :(得分:1)

此问题称为“延迟实例化”,是Flex组件生命周期的产品。如果你想对这个概念有一个非常彻底的解释,this white paper可能是我读过的最好的。

基本上,Flex会根据需要创建组件。每个组件都有一个生命周期,可以完成各个阶段:

  • 施工
  • 添加
  • 初始化
  • 无效
  • 验证
  • 更新
  • 去除

子组件在通过初始化阶段之前不可访问。这是Flex组件将调度其CREATION_COMPLETE事件的点,让您(和框架)知道它已准备好进行交互。在此活动之前,您在尝试访问组件或其子组件时将收到 null 引用错误。

ViewStacks默认情况下通过不初始化子组件来复合它,直到它们被调用显示为止。默认情况下,ViewStack的 creationPolicy 属性设置为 auto 。此属性有多个选项,包括 all 。但请注意,这可能会带来严重的性能问题,因为无论用户是否实际查看组件,都会立即初始化堆栈中的所有组件。

在您的具体情况下,这不是问题。包含视图堆栈的组件尚未完全初始化。您需要在CREATION_COMPLETE事件处理程序中设置ViewStack的子级。

答案 2 :(得分:0)

或者您可以提供“creationPolicy = all”,因为Flex仅从视图堆栈创建第一个可见子项

答案 3 :(得分:0)

您可以在MXML组件中使用此代码,以从其他MXML组件更改应用程序的ViewStack选定子项。然而,这不是一个好习惯。

FlexGlobals.topLevelApplication.mainViewStack.selectedChild = FlexGlobals.topLevelApplication.childId

您可以使用静态事件调度程序从一个视图调度事件,并在另一个视图中侦听该事件。