在Flex中,如何将属性传递给子组件?

时间:2013-12-02 22:35:10

标签: actionscript-3 flex mxml

我是Adobe Flex的新手,正在开发桌面Air应用程序。我的问题的主旨是弄清楚子组件如何知道其父属性之一。父母可能不止一个级别。

这是一个简化的例子来说明。

我有一个由几个子组件组成的自定义组件,在该示例中只有一个按钮。我有几个这个自定义组件的实例彼此相邻。当按下其中一个子按钮时,我想生成一个事件,让我的应用程序的另一部分知道按钮所属的自定义组件的哪个实例。我了解如何创建自定义事件,因此我将该部分从示例代码中删除。

我当前的方法涉及创建一个属性,(例如“位置”整数),我将其分配给mxml中的每个父组件。子组件还具有position属性,该属性设置为在“preinitialize”事件发生时与父级匹配。根据组件生命周期,preinitialize事件首先发生在父组件中,然后沿着子组件行发生。这样安全吗?或者有更好的方法吗?

使用数据绑定似乎浪费资源,因为在应用程序加载后,position属性永远不会更改。

以下是一些相关的代码段。

main.mxml

<s:VGroup>
    <components:CustomComponent position="0"/>
    <components:CustomComponent position="1"/>
    <components:CustomComponent position="2"/>
</s:VGroup>

CustomComponent.mxml

<fx:Script>
    <![CDATA[
        [Bindable]
        public var position:int;
    ]]>
</fx:Script>

<components:CustomButton 
    preinitialize="(event.target as CustomButton).setPosition(position)"/>

CustomButton.mxml

<s:Button>
    <fx:Script>
        <![CDATA[
            public var position:int;

            public function setPosition(position:int):void
            {
                this.position = position;
            }
        ]]>
    </fx:Script>    
</s:Button>

2 个答案:

答案 0 :(得分:0)

“子组件如何知道其父属性之一。”

-> this.parent.propertyName;

父母可能不止一个等级。 - &GT;那么它不是父母,而是祖先。您可能需要上升父链。 this.parent.parent。

同时查看this.document和this.owner。对于基于列表的控件,这些意味着不同的东西。

最后,看看事件冒泡。听起来你希望你的活动能够冒泡到你的顶级容器。

答案 1 :(得分:0)

通常,这是框架/微体系结构发挥作用的地方。您必须记住,Flex / Adob​​e Air库首先是组件库。这意味着你没有得到任何开箱即用的东西来帮助处理应用程序不同部分之间的通信。有时人们会尝试使用Singleton Pattern来管理依赖关系,但我可以从经验中告诉你,这是一个可怕的错误,从长远来看会花费你,因为代码变得非常脆弱而脆弱而且{{3} }。

如今,有许多框架旨在帮助您解决问题以及您将面临的其他问题。可以通过Google找到这些框架的列表,但cyclomatic complexitySwizMateRobotlegs是一个很好的起点。

您可能会遇到其他框架,例如Cairngorm和PureMVC。这些通常被称为“第一代”框架。就个人而言,我回避那些因为他们感觉有点过于沉重的干扰。