如何访问MXML类中的<fx:declarations>中的组件?</fx:declarations>

时间:2011-12-20 18:25:00

标签: flex flex4 mxml

是否可以在MXML类中访问声明的组件作为IFactory?我已经多次使用这种方式为Skin Parts声明工厂,但我从来没有想过如何从MXML中访问这些工厂。

以下是我期望工作的一个例子:

<fx:Declarations>
    <fx:Component id="labelDisplay">
        <s:Label fontSize="12" fontWeight="bold"/>
    </fx:Component>
</fx:Declarations>

<fx:Script>
    <![CDATA[
        override protected function createChildren():void
        {
            super.createChildren();

            var label1:Label = labelDisplay.newInstance();
            addElement(label1);

            var label2:Label = labelDisplay.newInstance();
            addElement(label2);

            var label3:Label = labelDisplay.newInstance();
            addElement(label3);
        }
    ]]>
</fx:Script>

*编辑*

我希望上面的代码可以工作的原因是基于Spark外观架构中处理动态外观部件的方式。如果上面的代码是MXML外观类的一部分,那么在我的主机组件中,我可以拥有以下代码。

[SkinPart(required="true",type="spark.controls.Label")]
public var labelDisplay:IFactory;

在Spark皮肤架构中,&lt; fx:Component&gt;在什么时候?变成一个IFactory?

2 个答案:

答案 0 :(得分:1)

我挖掘了Flex的SkinnableComponent,根据它们如何将MXML外观绑定到AS HostComponent来找到解决方案。显然,即使“labelDisplay”没有在FlashBuilder的自动完成中显示为具体的类成员,您仍然可以将其作为动态属性引用。我在这里修改了我原来的例子:

<fx:Declarations>
    <fx:Component id="labelDisplay">
        <s:Label fontSize="12" fontWeight="bold"/>
    </fx:Component>
</fx:Declarations>

<fx:Script>
    <![CDATA[
        override protected function createChildren():void
        {
            super.createChildren();

            var labelFactory:ClassFactory = this["labelDisplay"];

            var label1:Label = labelFactory.newInstance();
            addElement(label1);

            var label2:Label = labelFactory.newInstance();
            addElement(label2);

            var label3:Label = labelFactory.newInstance();
            addElement(label3);
        }
    ]]>
</fx:Script>

答案 1 :(得分:0)

我看到的问题是你没有创建一个iFactory,因此无法访问iFactory方法。

如果您需要,我建议您放入ActionScript并实际创建一个iFactory。这使用ClassFactory

protected var labelDisplay: iFactory = new ClassFactory(spark.controls.Label);

然后你的createChildren代码应该按原样运行。