Flex States: Gestion de la politique de création d'objet (creationPolicy)
Par défaut, les composants n'appartenant pas à l'état de base ne sont pas instanciés tant que l'état qui les concerne n'est pas demandé. L'exemple suivant montre ce problème. La fonction trace(); donne en sortie null car button n'est pas encore défini lorsque l'application démarre pour la première fois.
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
layout="absolute"
initialize="initializeHandler(event)"
>
<mx:states>
<mx:State name="exemple">
<mx:AddChild>
<mx:Button id="button" label="Exemple"/>
</mx:AddChild>
</mx:State>
</mx:states>
<mx:Script>
<![CDATA[
private function initializeHandler(event:Event):void{
trace (button);
}
]]>
</mx:Script>
</mx:Application>
Cependant, vous pouvez gérer le moment où les composants ajoutés par les states sont instanciés en utilisant une "creationPolicy".
La "creationPolicy" utilisée par défaut est "auto" ce qui veut dire que les composants sont instanciés lorsque l'état est appelé pour la première fois. Vous pouvez fixer une "creationPolicy" pour chaque composant en utilisant l'attribut "creationPolicy" du tag
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
layout="absolute"
initialize="initializeHandler(event)"
>
<mx:states>
<mx:State name="exemple">
<mx:AddChild creationPolicy="all">
<mx:Button id="button" label="Exemple"/>
</mx:AddChild>
</mx:State>
</mx:states>
<mx:Script>
<![CDATA[
private function initializeHandler(event:Event):void{
trace (button);
}
]]>
</mx:Script>
</mx:Application>
Lorsque la "creationPolicy" a une valeur de "none", le composant n'est pas instancié jusqu'à ce que vous appeliez explicitement la méthode createInstance(); d'un objet AddChild.
Si vous définissez l'objet AddChild à l'aide du tag
L'exemple suivant montre le comportement d'une application avec "creationPolicy" défini sur none. Le premier appel à trace() donne null en sortie car le composant n'a pas encore été instancié. Le second appel à trace() donne la référence de l'objet en sortie car il intervient immédiatement après l'appel à createInstance().
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
layout="absolute"
initialize="initializeHandler(event)"
>
<mx:states>
<mx:State name="exemple">
<mx:AddChild creationPolicy="none" id="exampleAddChild">
<mx:Button id="button" label="Exemple"/>
</mx:AddChild>
</mx:State>
</mx:states>
<mx:Script>
<![CDATA[
private function initializeHandler(event:Event):void{
trace (button);
exampleAddChild.createInstance();
trace (button);
}
]]>
</mx:Script>
</mx:Application>
Quelle "creationPolicy" utiliser ?
Dans la plupart des applications, la valeur par défaut (auto) de la "creationPolicy"est la bonne configuration. Cependant, il y a plusieurs raisons pour lesquelles vous devriez utiliser une "creationPolicy" différente.
La "creationPolicy" all par exemple peut être utilisée dans au moins des scénarios:
- Le composant ajouté est long à s'initialiser:
Si le composant n'est initialisé qu'à la demande de l'état, l'utilisateur va remarquer un certain délai. En fixant la "creationPolicy" sur "all", le composant est initialisé quand l'application démarre, ce qui devrait améliorer les problèmes liés à l'initialisation du composant et au délai pendant le changement d'états.
- Vous voulez référencer les composants avant que l'état ne soit demandé
Par exemple, si vous créez un composant ayany plusieurs états, vous voudriez peut-être référencer ces composants dans une autre méthode.
La "creationPolicy" none ne semble pas immédiatement utile, cependant remarquer que auto et all sont très distinctes:
- Quand vous choisissez auto, les composants ne sont pas instanciés jusqu'à l'appel à l'état
- Quand vous choisissez all, les composants sont instanciés à l'initialisation de l'application
Il y a des raisons pour lesquelles vous voudriez vous assurez qu'un composant s'initialise avant qu'un état soit appelé, mais vous ne voulez pas forcer le composant à s'instancier avec l'application. Par exemple,un algorithme complexe pourrait contenir beaucoup d'états, chacun prenant un certain temps à s'initialiser. Si vous fixez la "creationPolicy" de tous les objets AddChild sur all, l'utilisateur aura peut-être à attendre un long moment avant que l'application ne s'initialise. Cependant, il serait peut-être plus agréable si l'application démarre de suite pendant que les composants pour le reste des états sont initialisés en tâche de fond. L'utilisation de la "creationPolicy" none vous permet de faire cela. Appelez simplement la méthode createInstance() de l'objet AddChild pour instancier le composant.
Articles similaires
- Flex States: Création et application d'états simples
- Flex States: Définir des états basés sur des états existants
- Flex 4 – Différences entre Flex 3 et Flex 4 (4-Nouvelle syntaxe des States)
- Flex States: Création d'états en ActionScript
- Flex States: Modifier le Style d'un Composant
Aucun trackbacks pour l'instant





