如何在 MXML 类中访问 <fx:声明> 中的组件?



是否可以将声明的组件作为MXML类中的IFactory访问?我已经为皮肤部件多次使用这种声明工厂的风格,但是我从来没有弄清楚如何从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>

* edit *

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

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

在Spark蒙皮架构中,变成IFactory?

我深入研究了Flex的skinnablecomcomponent,以找到基于他们如何将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>

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

如果你需要的话,我建议你进入ActionScript并创建一个iFactory。它使用ClassFactory类
protected var labelDisplay: iFactory = new ClassFactory(spark.controls.Label);

那么你的createChildren代码应该可以正常工作。

最新更新