更改转发器中另一个组件中的子组件

时间:2010-11-10 08:10:29

标签: flex flex3

我在转发器中有自定义组件。该组件具有子组件,根据某些条件,该组件可以是两种类型。我所做的是使用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来刷新,但它似乎不起作用。 任何想法都会受到欢迎。

由于

1 个答案:

答案 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>