2008-10-13 8 views
1

Je construis ma première application flexible et je la scinde actuellement en plusieurs composants pour la rendre maintenable. J'ai un écran qui contient une liste qui est affichée et rempli après une tentative de connexion succesfull:Fonction d'accès dans le composant directement

Une partie de l'application principale:

<mx:ViewStack id="vsAdmin" height="100%" width="100%"> 
    <mx:TabNavigator id="adminTabs" width="100%" height="100%" historyManagementEnabled="false"> 
     <myComp:compBeheerdersAdmin id="beheerdersViewstackA"/> 
    </mx:TabNavigator> 
</mx:ViewStack> 

Dans le composant compBeheerdersAdmin il y a une fonction requestBeheerdersList() qui obtient les données du serveur et les lie à la liste via un gestionnaire.

Après connexion le code suivant de l'application principale:

mainViewstack.selectedChild = vsAdmin; 
//beheerdersViewstackA.createComponentsFromDescriptors(); 
beheerdersViewstackA.requestBeheerdersList(); 

La fonction requestBeheerdersList() ne fait rien (n'est pas atteint, je mets une alerte en première déclaration dans la fonction, mais qui ne figure pas) lorsque Je me connecte après un nouveau chargement du swf, mais quand je me déconnecte et me reconnecte, la fonction est atteinte et l'alerte est affichée et la liste est remplie avec les données du serveur. Des idées?

+0

Ajout de creationPolicy = "all" à l'application principale résout le problème, mais cela va augmenter le temps de chargement. La ligne commentée (createComponentsFromDescriptors) ne résout pas le problème. – Overbeeke

Répondre

1

Je m'assurerais que le composant existe que vous appelez avant d'appeler la fonction suivante. Cela pourrait être fait en forçant creationPolicy = tout comme vous l'avez compris. Vous pouvez également ajouter un écouteur d'événement pour le creationComplete appeler la fonction que vous voulez:

private function doThisFirst():void{ 
     mainViewstack.selectedChild = vsAdmin; 
     vsAdmin.addEventListener(FlexEvent.CREATION_COMPLETE,doThis); 
} 


private function doThis():void{ 
     beheerdersViewstackA.requestBeheerdersList(); 
} 

Cela peut ne pas être tout à fait correct mais j'essayé de recréer à votre exemple précis. Si vous êtes familier avec la création de viewstack de ses enfants et des listeurs d'événements, vous devriez être capable de l'adapter à votre besoin spécifique.

0

Vous pouvez avoir creationComplete définir dans votre mxml

<mx:Canvas ... creationComplete="onCreationComplete()"> 

<mx:Script> 
    <![CDATA[ 
    private function onCreationComplete():void { 
     requestBeheerdersList() 
    } 
]]> 
</mx:Script> 

ou peut-être

<mx:Canvas ... creationComplete="requestBeheerdersList()"> 

La difficulté avec Flex est de comprendre comment un composant MXML cartes équivalent classe actionscript pur. Lorsque vous avez dans votre code mxml quelque chose comme < local: Mycomponent id = "myComponent" >, cela ajoute en tant qu'enfant une instance d'une classe. Le fichier mxml, Mycomponent.mxml, définit la classe. À moins d'être déclarées comme statiques, les fonctions répertoriées dans la balise < mx: Script > sont des fonctions qui s'appliquent à l'instance. Il n'y a aucun constructeur que vous pouvez explicitement définir mais l'instance n'est pas disponible avant la création réelle. Vous devez donc compter sur creationComplete pour exécuter toute fonction que vous auriez appelée depuis une fonction constructeur dans une classe strictement AS3.

Questions connexes