2012-07-11 1 views
0

J'utilise Flash Builder 4.6 pour créer une application pour un projet uni. J'ai un composant Spark personnalisé, et j'ai besoin de créer dynamiquement un certain nombre d'instances de ce composant à l'exécution en fonction du nombre d'éléments XML renvoyés via un script PHP.Création de composants MXML via une boucle ActionScript dans Flex

Cela pourrait être un peu déroutant, alors laissez-moi écrire les étapes: 1) L'application envoie une requête HTTPService à un script PHP hébergé sur le serveur. 2) Le PHP accède à la base de données SQL et renvoie une série de données XML. 3) Le code ActionScript crée dynamiquement des instances X de mon composant Flex personnalisé, où X est le nombre de données dans le fichier XML.

Voici le code que j'ai jusqu'à présent (parce que je untidy essaie de le faire fonctionner):

ActionScript:

 [Bindable] 
     public var holderArray:Array = new Array(100); 

     public function createMenu(e:MouseEvent):void { 
      var count:int = 0; 
      var curMenuItem:menuItemContainer = new menuItemContainer(); 
      while (count < loadedMenu.length){ 
       curMenuItem.itemName = loadedMenu.getItemAt(count).name; 
       curMenuItem.itemDesc = loadedMenu.getItemAt(count).description; 
       curMenuItem.itemPrice = numForm.format(loadedMenu.getItemAt(count).price);     
       curMenuItem.imageFile = loadedMenu.getItemAt(count).url; 
       //curMenuItem.y = count * 120 
       //menuItemGroup.addElement(curMenuItem); 
       holderArray[count] = curMenuItem; 
       count ++; 
      } 
      //testString = holderArray[1].itemName; 
      var count2:int = 0; 
      for each (var menuItem:menuItemContainer in holderArray){ 
       menuItem.name = "menuItem" + count2; 
       menuItem.id = "menuItem" + count2; 
       //testString += menuItem.name; 
       menuItemGroup.addElement(menuItem); 
       count2++; 
      } 
     } 

MXML:

<s:VGroup id="menuItemGroup" x="40" y="150"> 
</s:VGroup> 

Ce qui semble ce qui se passe avec ce code est que chacune de mes trois données XML qui sont retournées sont utilisées dans des instances de menuItemContainer, mais quand chacune est ajoutée à menuItemGroup, elle écrase celle qui est alre ady là. Je ne suis pas sûr si l'élément est réellement écrasé, ou si le nouvel élément est juste assis sur les précédents, mais si ce dernier est vrai je ne peux pas trouver un moyen d'organiser les composants. J'ai essayé de mettre menuItem.y dans la boucle (en fonction de count2), mais en vain.

Merci d'avance pour toutes suggestions/réponses. Benjamin.

+1

On dirait que quelqu'un vous a déjà donné la bonne réponse. Mon seul autre commentaire, c'est que vous pouvez envisager d'afficher vos éléments dans une liste avec un itemRenderer et un XMLListCollection au lieu de créer manuellement des enfants et de les placer dans un groupe. – JeffryHouser

+0

Je dois retourner @ www.Flextras.com sur celui-ci: vous devriez utiliser une liste ou un DataGroup (ou un répéteur dans Flex 3) dans ce genre de situation. Beaucoup plus facile. – RIAstar

+0

J'apprends encore beaucoup de choses Flex. Je ne l'utilise que depuis quelques mois. Il semble y avoir beaucoup de manières différentes d'accomplir n'importe quoi (comme avec la plupart de programmation). Si j'utilise un XMLListCollection, comment l'afficherais-je dans l'application? J'ai essayé d'utiliser un DataGroup mais je n'ai pas été loin. Cheers. –

Répondre

2

Mettre cette ligne

var curMenuItem:menuItemContainer = new menuItemContainer(); 

dans votre boucle while. Avec votre code tel quel, vous ne créez qu'une seule instance de menuItemContainer puis changez continuellement les propriétés de celui-ci menuItemContainer dans votre boucle while. Au lieu de cela, vous devez créer une nouvelle instance différente de menuItemContainer à chaque itération de la boucle.

+0

+1; Je pense que vous avez trouvé la solution. – JeffryHouser

+0

Oui, c'est fait, merci. Je pensais que les ajouter au VGroup dans chaque itération afficherait une instance de l'objet avec ses données actuelles, mais il semble que j'avais tort. Merci encore! B. –

Questions connexes