Rss Feed

Pseudo comportement synchrone en flex

Si vous programmez depuis quelques temps en AS3, vous avez du vous rendre compte que les événements sont asynchrones, c’est à dire que l’on ne va pas avoir le résultat d’une fonction dès l’exécution de cette dernière terminée, mais au bout d’un temps indéterminé, et uniquement via une fonction qui collecte l’événement en question.

Hors il est parfois nécessaire d’avoir un certain ordonnancement dans les actions, en particulier lorsque l’on utilise des web services ou autre remoting.

Imaginons que l’on veut récupérer une liste de clients une fois que l’on a récupéré la liste des catégories de clients disponibles. Il existe 2 méthodes pour résoudre ce problème :

  1. Il suffit d’appeler la méthode de récupération des clients dans l’ »handler » de la fonction de récupération des catégories de clients.
  2. On utilise la méthode callLater(function, args);

Voici des exemples de codes mettant en place les 2 méthodes. (On assume ici que notre webservicesObject a un eventListener sur la méthode getCategoriesClients et un sur la méthode getClients() qui emmène respectivement sur categoriesClients_handler et clients_handler)

1ère méthode :

private function init():void {
webservicesObject.getCategoriesClients();
}

private function categoriesClients_handler(e:Event):void {
trace("Récupération des catégories de clients terminée");
webservicesObject.getClients();
}

private function clients_handler(e:Event):void {
trace("Récupération des clients terminée");
}

2ème méthode :

private var isCategoriesLoaded:Boolean : false;


private function init():void {
webservicesObject.getCategoriesClients();
webservicesObject.getClients();
}

private function categoriesClients_handler(e:Event):void {
trace("Récupération des catégories de clients terminée");
isCategoriesLoaded = true;
}

private function clients_handler(e:Event):void {
if(isCategoriesLoaded)
trace("Récupération des clients terminée");
else
callLater(clients_handler, e);
}

La fonction callLater(function, args) va donc rappeler notre handler en repassant en paramètre l’événement, de la même manière qu’a été déclenché l’événement par le webservice.

Astuce VBox – Repeater

Il vous est peut être arrivé de vouloir associer au sein d’un VBox un Repeater et d’autres éléments fixes.

Prenons l’exemple suivant :

<mx:VBox>
<mx:Repeater datasource="{monDataprovider}" id="maSource">
<mx:Text text="{maSource.currentItem.monTexte}" />
</mx:Repeater>
<mx:Text text="Texte placé après le repeater" />
</mx:VBox>

On doit donc voir tous les éléments du dataprovider « monDataProvider » à la suite, puis le texte « Texte placé après le repeater ». Mais que se passe t’il si le dataprovider évolue. Et bien on se retrouve avec le texte « Texte placé après le repeater » qui est avant les éléments du dataprovider.

Pour solutionner ce problème, il suffit de placer un VBox juste autour du repeater. Ainsi les seuls éléments qui se mettront à jour seront à l’intérieur d’un conteneur existant, et l’ordonnancement des éléments restera celui que vous avez décidé en écrivant votre mxml.

Mxml corrigé :

<mx:VBox>
<mx:VBox>
<mx:Repeater datasource="{monDataprovider}" id="maSource">
<mx:Text text="{maSource.currentItem.monTexte}" />
</mx:Repeater>
</mx:VBox>
<mx:Text text="Texte placé après le repeater" />
</mx:VBox>

ActionScript 3 – Guide de référence – Adobe Flex / Adobe Air

flexAirGuide.jpg

Voici une publication PDF de l’API actionscript 3 pour le développement de vos RIA Adobe Flex et Air.

Article Devnet Adobe :

Adobe technology platform ActionScript reference for RIA development

Document PDF :

Adobe technology platform – ActionScript Reference – Rich Internet Application Development

Extraire l’url d’appel de votre application flex

Vous avez des modules qui ont besoin de l’url d’appel de votre html ou swf pour charger des fichiers, mais entre votre site local, et online, l’url n’est pas la même. Plutôt que de vous embêter à changer dans un fichier de configuration et de devoir recompiler avant d’envoyer sur votre platforme online, voici un petit bout de code permettant de détecter l’url de votre application.

var splittedUrl:Array = Application.application.url.split('/');
var endIndex:int = 0;
// Calcule l'index du début du fichier .html or .swf que l'on vient de lancer
for(var j:int = 0; j < splittedUrl.length-1; j++) {
endIndex += splittedUrl[j].length+1;
}

// Extraction du fichier .html ou .swf de la fin de l'url
var urlSwf:String = Application.application.url.substring(0, endIndex);


Il vous suffit ensuite d’utiliser « urlSwf » devant tous les chemins. Par exemple : <mx:Image source= »{urlSwf}datas/monImage.jpg » />