Apache Adobe Flex TutorialTutoriaux Adobe Flex & AIR en Français

27jan/088

Flex States: Ajouter et Supprimer des Composants

L'utilisation la plus commune des states est l'ajout et la suppression de composants. Vous pouvez utilisez le tag <mx:AddChild> pour ajouter un ou des composants. De la même manière, on utilisera le tag <mx:RemoveChild> pour supprimer un composant. L'exemple suivant défini un état nommé newTextInput qui ajoute un champ texte.

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
	<mx:states>
		<mx:State name="newTextInput">
			<mx:AddChild>
				<mx:TextInput id="textInput"/>
			</mx:AddChild>
		</mx:State>
	</mx:states>
	<mx:Button id="button" label="Ajouter un champ" click="currentState='newTextInput'"/>
</mx:Application>

Le comportement par défaut du tag <mx:AddChild> est d'ajouter un/des composants à l'application ou au composant pour lequel l'état est défini. Cependant, si vous voulez définir un composant cible, utilisez l'attribut "relativeTo". L'exemple suivant ajoute un nouveau bouton comment enfant d'une VBox ayant pour id "vbox".

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" viewSourceURL="srcview/index.html">
	<mx:states>
		<mx:State name="newTextInput">
			<mx:AddChild relativeTo="{vbox}">
				<mx:TextInput id="textInput"/>
			</mx:AddChild>
		</mx:State>
	</mx:states>
	<mx:VBox id="vbox">
		<mx:CheckBox id="checkbox1" label="One"/>
		<mx:CheckBox id="checkbox2" label="Two"/>
		<mx:Button id="button" label="Ajouter un champ" click="currentState='newTextInput'"/>
	</mx:VBox>
</mx:Application>

Flex Source Code Download: Télécharger le code source complet de l'application

This movie requires Flash Player 11

Lorsque l'on ajouter un composant comme enfant, cette nouvelle instance est ajoutée comme dernier enfant du composant cible par défaut. Par exemple, dans l'exemple précédent, le nouveau bouton est ajouté en dessous des deux CheckBox de l'état de base (base state). Cependant, vous pouvez contrôler où les nouvelles instances sont ajoutées en utilisant l'attribut "position". La valeur par défaut est "lastChild" mais vous pouvez spécifier "firstChild" ajouter la/les nouvelles instance au début du conteneur cible.

Quand vous utiliser "lastChild" ou "firstChild" comme valeur de position, la valeur de cible est par rapport au conteneur auquel vous voulez ajouter le composant. Lorsque vous utilisez "before" ou "after" pour valeur de position, la cible est interprétée comme un enfant du composant auquel vous voulez ajouter le composant. Si vous voulez ajouter un composant enfant immediatement avant ou après un composant existant, vous pouvez spécifier directement l'enfant comme valeur de cible et utiliser la valeur "before" ou "after" pour l'attribut "position".

Pour ajouter le champ texte immédiatement après la première CheckBox, modifier simplement la ligne avec le tag <mx:AddChild pour la remplacer par:

<mx:AddChild relativeTo="{checkbox1}" position="after">

Dans le cas d'une suppression d'un composant avec le tag <mx:RemoveChild>, la manipulation est généralement plus simple que l'ajout de composant. Le tag <mx:RemoveChild> ne requiert qu'un attribut nommé "target". L'attribut "target" permet de spécifier la référence au composant que vous voulez supprimer.

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" viewSourceURL="srcview/index.html">
	<mx:states>
		<mx:State name="noCheckBoxes">
			<mx:RemoveChild target="{checkbox1}"/>
			<mx:RemoveChild target="{checkbox2}"/>
		</mx:State>
	</mx:states>
	<mx:VBox id="vbox">
		<mx:CheckBox id="checkbox1" label="One"/>
		<mx:CheckBox id="checkbox2" label="Two"/>
		<mx:Button id="button" label="Supprimer les CBox" click="currentState='noCheckBoxes'"/>
	</mx:VBox>
</mx:Application>

Flex Source Code Download: Télécharger le code source complet de l'application

This movie requires Flash Player 11

Remplis sous: States || Taggé comme: , , Laisser un commentaire

Articles similaires

Commentaires (8) Trackbacks (1)
  1. Salut,
    en flex 4 j'utilise AddItems pour ajouter des objet dans l'affichage de mon State.
    donc tout vas super bien jusqu'au moment ou je souhaite le retirer ;... autant avant on avait Removechild autant maintenant avec AddItems je vois pas.
    pour l'ajout je fais ça en gros :

    MXML:
    1. for each(var etat:State in this.states)
    2.                 {
    3.                     if(nomEtat == etat.name)
    4.                     {               
    5.                         var ajoutItem:AddItems = new AddItems();
    6.                        
    7.                         ajoutItem.items = objet;   
    8.                         etat.overrides.push(ajoutItem);
    9.                     }
    10.                 }

  2. Salut,
    je ne saurais pas trop te répondre mais RemoveChild existe encore dans l'API:

    http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/mx/states/RemoveChild.html
    Cela ne fonctionne pas ?

    Fabien

  3. Merci pour ta reponse rapide ! :)
    en effeet RemoveChild existe belle est bien , seulement il n'a pas l'air d'avoir beaucoup d'effet si on utilise AddItems à la place de AddChild. peut etre pourra tu me repondre mais à quoi sert la funnction Remove() presente dans AddItems ? parce que quand je lis "Removes the override" je comprend pas trop l'override d'un state c'est bien un array d'AddItem non ?

  4. Oula, je ne sais pas trop, pas encore bidouillé avec les states :P . Au pire, tu peux aller fouiller un peu dans le code de Flex ;)

    Fab

  5. Bonjour,

    j'ai une application qui utilise un menu accordéon. ce dernier est un composant personnalisé donc mis à part dans un fichier mxml.

    selon l'utilisateur connecté, certains éléments l'accordéon sont visibles et d'autres ne le sont pas.
    quand je met les "states" dans l'application, le composant ne les reconnait pas.

    voici un bout de code du composant accordion:

    MXML:
    1. <mx:Accordion>
    2.        
    3.         <s:NavigatorContent id="param1"
    4.                 label="PARAMS"
    5.                 width="100%">
    6.             <composants:PLinkBar     id="p1Link"
    7.                         direction="vertical"
    8.                                                 enabled.state1="true"
    9.                         enabled.state2="false"
    10.                         enabled.state3="false">
    11.                 <composants:dataProvider>
    12.                         <fx:String>Menu item 1</fx:String>
    13.                         <fx:String>Menu item 2</fx:String>
    14.                         <fx:String>Menu item 3</fx:String>
    15.                         <fx:String>Menu item 4</fx:String>
    16.                    
    17.                 </composants:dataProvider>
    18.            
    19.             </composants:PLinkBar>
    20.                        
    21.         </s:NavigatorContent>       
    22. </mx:Accordion>

    state1,2 et 3 sont déclarées dans le fichier Application.
    mais quand je met currentState="state2" (par exemple) le linkBar est toujours activée??!!

    Merci

  6. Salut,
    Il faut que tu modifie le currentState de la PLinkBar en question. Sur quel objet accèdes-tu à la propriété currentState?

    Fabien

  7. Merci,

    dans le fichier d'entrée de l'application j'ai les états suivants:

    MXML:

    le composant Accordéon est ajouté comme suite:

    MXML:

    lorsque l'utilisateur se connecte, je change l'état au "click" du boutton "connecter" (simple boutton dans un panel).

    Actionscript:
    1. currentState="state2";

    à ce state, le PlinkBar doit se désactiver, mais rien ne se passe!!

    merci

  8. ok, j'ai trouvé la solution.
    en fait tu me l'as déjà donnée mais j'ai pas saisi.

    j'ai donné un "id" (="menuPrincipal") au composant menuAccordion et fait:
    menuPrincipal.currentState = "state1"

    state1 est re-déclaré dans le composant.

    Merci


Leave a comment

(required)