我在转发器中有自定义组件。该组件具有子组件,根据某些条件,该组件可以是两种类型。我所做的是使用UIComponent作为占位符。
在重复的组件中,让我们说RepeatedComponent:
<mx:VBox>
<mx:UIComponent id="placeHolder"/>
</mx:VBox>
我在具有转发器的组件中执行此操作:
// Function where I try to inject the child component :
private function getComponent():UIComponent{
if(condition)
{
return new ChildComponentA();
}
else
{
return new ChildComponentB();
}
]]>
</mx:Script>
<mx:VBox>
<mx:Repeater id="repeteur"
recycleChildren="true"
dataProvider="{arrayBeneficiaires}" >
<components:RepeatedComponent id="repeatedComponent"
beneficiaire="{repeteur.currentItem}"
placeHolder="{getComponent()}"/>
</mx:Repeater>
</mx:VBox>
当我在creationComplete调用的函数中放置断点时,我可以看到分配给placeHolder的组件是正确的但它没有显示在我的显示器上。我尝试通过在我能想到的每个地方调用invalidateDisplayList来刷新,但它似乎不起作用。 任何想法都会受到欢迎。
由于
答案 0 :(得分:0)
我怀疑问题是来自getComponent()
的值永远不会添加到舞台上。 ie - 将placeHolder
的值设置为某事与调用addChild(getComponent())不同。
因此,以下方法可行:
<mx:Repeater id="repeteur"
recycleChildren="true"
dataProvider="{arrayBeneficiaires}" >
<components:RepeatedComponent id="repeatedComponent"
beneficiaire="{repeteur.currentItem}"
creationComplete="getComponent(repeatedComponent)"/>
</mx:Repeater>
private function getComponent(parent:RepeatedComponent):void {
if(condition)
{
parent.addChild(new ComponentA());
}
else
{
parent.addChild(new ComponentB());
}
}
请注意,在这种情况下,您不需要placeHolder UIComponent(实际上并不用于任何目的)。
但是,我建议将此逻辑移到RepeatedComponent
内,因为看起来这个决定是组件的责任,而不是父组件。
然后代码变得更清晰:
<mx:Repeater id="repeteur"
recycleChildren="true"
dataProvider="{arrayBeneficiaires}" >
<components:RepeatedComponent id="repeatedComponent"
beneficiaire="{repeteur.currentItem}" />
</mx:Repeater>
<!-- RepeatedComponent.mxml -->
<mx:VBox>
<mx:UIComponent id="placeHolder"/>
</mx:VBox>
<mx:Script>
private var _beneficiaire:Object
public function get beneficiaire():Object {
return _beneficiaire;
}
public function set beneficiaire(value:Object):void {
_beneficiaire = value;
createSubComponent();
}
private function createSubComponent():void
if(condition)
{
parent.addChild(new ComponentA());
}
else
{
parent.addChild(new ComponentB());
}
}
</mx:Script>