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

29jan/080

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 ou la propriété "creationPolicy" de la classe AddChild. Les valeurs possibles sont auto (défaut), all et none. Quand vous fixez la "creationPolicy" d'un composant ajouté à all, le composant est instancié au démarrage de l'application. L'exemple suivant montre ce comportement. Puisque la "creationPolicy" du bouton est maintenant fixée à all, la fonction trace(); affiche en sortie la référence au composant.

<?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 , vous devez lui assigner un id

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

Commentaires (0) Trackbacks (0)

Aucun commentaire pour l'instant


Leave a comment

(required)

Aucun trackbacks pour l'instant