2010-11-10 4 views
0

J'ai un composant personnalisé dans un répéteur. Ce composant a un composant enfant qui peut être de deux types selon certaines conditions. Ce que j'ai fait était d'utiliser un UIComponent comme un espace réservé.Modification d'un composant enfant dans un autre composant d'un répéteur

Dans le composant répété, permet de dire RepeatedComponent:

<mx:VBox> 
    <mx:UIComponent id="placeHolder"/> 
</mx:VBox> 

Et je fais cela dans le composant ayant le répéteur:

// 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> 

Quand je place dans les points d'arrêt des fonctions appelées à creationComplete , Je peux voir que le composant assigné à placeHolder est correct mais il n'apparaît pas sur mon affichage. J'ai essayé de rafraîchir en appelant invalidateDisplayList dans tous les endroits que je peux penser, mais cela ne semble pas fonctionner. Toutes les idées seraient les bienvenues.

Merci

Répondre

0

Je soupçonne que la question est que la valeur de getComponent() est jamais ajouté à la scène. c'est-à-dire - mettre la valeur de placeHolder à quelque chose n'est pas la même chose que d'appeler addChild (getComponent()).

Par conséquent, les éléments suivants travailleraient:

<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()); 
     } 
    } 

Notez que dans ce scénario, vous n'avez pas besoin placeHolder UIComponent (qui ne sert pas vraiment le but).

Cependant, je recommanderais que cette logique soit déplacée à l'intérieur de RepeatedComponent, car il semble que cette décision soit de la responsabilité du composant, plutôt que du parent.

Ensuite, le code devient beaucoup plus propre:

<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> 
+0

ajoutant que l'enfant était Explicitement bien la solution. Merci! – Sandy

Questions connexes