是否可以在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?
答案 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代码应该按原样运行。