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
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
Articles similaires
- Flex States: Overrides (AddChild, SetProperty, SetEventHandler) en ActionScript
- Flex States: Définir des états basés sur des états existants
- Flex States: Création et application d'états simples
- Flex 4 – Différences entre Flex 3 et Flex 4 (4-Nouvelle syntaxe des States)
- Flex States: Modifier le Style d'un Composant






20 décembre 2010
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 :
20 décembre 2010
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
20 décembre 2010
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 ?
20 décembre 2010
Oula, je ne sais pas trop, pas encore bidouillé avec les states
. Au pire, tu peux aller fouiller un peu dans le code de Flex
Fab
14 juin 2011
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:
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
14 juin 2011
Salut,
Il faut que tu modifie le currentState de la PLinkBar en question. Sur quel objet accèdes-tu à la propriété currentState?
Fabien
14 juin 2011
Merci,
dans le fichier d'entrée de l'application j'ai les états suivants:
le composant Accordéon est ajouté comme suite:
lorsque l'utilisateur se connecte, je change l'état au "click" du boutton "connecter" (simple boutton dans un panel).
à ce state, le PlinkBar doit se désactiver, mais rien ne se passe!!
merci
14 juin 2011
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