是否可以将声明的组件作为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蒙皮架构中,
我深入研究了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代码应该可以正常工作。