2 votes

Flex 4 - Comment boucler sur les enfants d'un conteneur lorsqu'ils sont dépendants de l'état du conteneur ?

Les nouveaux États de Flex re-parentent les éléments visuels marqués par includeIn/excludeFrom. Si j'ai un groupe (MainGroup) avec 5 enfants/éléments qui sont contrôlés par l'état, existe-t-il encore un moyen d'obtenir une référence aux enfants de MainGroup ? mainGroup.numChildren et mainGroup.numElements ne fonctionnent pas puisque les enfants sont re-parentés. Au mieux, ils affichent 1.

<s:states>
   <s:State name="view1State" />
   <s:State name="view2State" />
   <s:State name="view3State" />
   <s:State name="view4State" />
</s:states>

<s:Group id="mainGroup">
    <shipping:OrderShipping id="view1"
            includeIn="view1State" />
    <payment:OrderPayment id="view2"
            includeIn="view2State" />
    <verification:OrderVerification id="view3"
            includeIn="view3State" />
    <confirmation:OrderConfirmation id="view4"
            includeIn="view4State" />
</s:Group>

2voto

Jonathan Rowny Points 5801

Si vous souhaitez que les états contrôlent visible/includeinlayout plutôt que la parentalité, procédez comme suit

<s:states>
    <s:State name="view1State" />
    <s:State name="view2State" />
    <s:State name="view3State" />
    <s:State name="view4State" />
</s:states>
<s:Group id="mainGroup">
    <shipping:OrderShipping id="view1" 
        visible="false" 
        includeInLayout="false" 
        visible.view1State="true" 
        includeInLayout.view1State="true"/>
    <payment:OrderPayment id="view2" 
        visible="false" 
        includeInLayout="false" 
        visible.view2State="true" 
        includeInLayout.view2State="true"/>
    <verification:OrderVerification id="view3" 
        visible="false" 
        includeInLayout="false" 
        visible.view3State="true" 
        includeInLayout.view3State="true" />
    <confirmation:OrderConfirmation id="view4" 
        visible="false" 
        includeInLayout="false"
        visible.view4State="true" 
        includeInLayout.view4State="true"/>
</s:Group>

2voto

NoobsArePeople2 Points 1711

J'ai une situation similaire dans l'une de mes applications et voici comment j'ai procédé. Je me sens obligé de dire que, bien que cela fonctionne, j'ai l'impression que c'est un peu bidon. C'est dans cette optique que j'ai décidé d'utiliser cette méthode :

  1. Créer un autre état, nous l'appellerons cheating . Faites de cet état l'état par défaut (mettez-le en premier dans vos states de la gamme.
  2. Mettez à jour toutes vos vues pour qu'elles soient incluses dans cet état.
    Par exemple, <shipping:OrderShipping id="view1" includeIn="cheating,view1State" />
  3. Créer un nouveau membre de classe de type Array appelé views .
  4. Ajouter un creationComplete gestionnaire de l'événement. Dans le gestionnaire populdate views avec des références à chacune des vues. Par exemple, views = [view1, view2, view3, view4];
  5. Changez l'état pour votre "premier" (non cheating ) : setCurrentState("view1State");

Après tout cela, votre views aura des références à chacune des vues, quel que soit l'état dans lequel se trouve votre application.

1voto

JeffryHouser Points 35567

Je ne sais pas si l'implémentation de l'état sous-jacent supprime / ajoute des enfants au composant ou modifie leur visibilité.

Dans le premier cas, j'essaierais quelque chose comme ceci :

for (var x : int = 0; x<mainGroup.numChildren ; x++){
 var child : UIComponent = mainGroup.getChildAt(x);
 if(child.parent){
   // The child has a parent, so it must be displayed; do your processing 
 } else {
   // really this should never occur 
 }
}

S'il s'agit d'un problème de visibilité, faites-le :

for (var x : int = 0; x<mainGroup.numChildren ; x++){
 var child : UIComponent = mainGroup.getChildAt(x);
 if(child.visible){
   // The child is displayed; do your processing 
 } else {
   // child isn't displayed
 }
}

Je pense que la première approche est la bonne.

[Note : j'ai écrit ce code dans le navigateur].

1voto

Tony Smith Points 161

J'ai obtenu la meilleure réponse ! Je vous laisse décider. Il suffit d'opérer sur le tableau des états...

 for each (var viewState:State in mainDocument.states)
{
    var overrides:Array = viewState.overrides;

    for (var i:int = 0; i < overrides.length; i++)
    {
        var addItems:AddItems = overrides[i];
        if (addItems.destination === mainDocument.mainGroup)
            trace((addItems.items as UIComponent).name);
    }

}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X