IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Flex Discussion :

Gestion des states [Flex4]


Sujet :

Flex

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    248
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 248
    Par défaut Gestion des states
    Bonjour, je rencontre une difficulté dans la gestions des états.
    Voici mon document mxml de base :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    private function affEtatDebut(e:Event):void
    {
    this.currentState='State0';
    }
    private function affEtat0(e:Event):void
    {
    	this.currentState='State1';
    }
    private function affEtat1(e:Event):void
    {
    	this.currentState='Debut';
    }
    <s:states>
    	<s:State name="Debut"/>
    	<s:State name="State0"/>
    	<s:State name="State1"/>
    </s:states>
     
    	<vues:DiapAccueil includeIn="Debut" width="100%" height="100%" ChangEtat="affEtatDebut(event)"/>
    	<vues:Diap0a includeIn="State0" width="100%" height="100%" ChangEtat="affEtat0(event)"/>
    	<vues:Diap0b includeIn="State1" width="100%" height="100%" ChangEtat="affEtat1(event)" />
    Chaque état est doté d'une metadata couplée avec un dispachEvent.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <fx:Metadata>
    [Event(name="ChangEtat", type="flash.events.Event")]
    </fx:Metadata>
    <fx:Script>
    <![CDATA[
    protected function button2_clickHandler(event:MouseEvent):void
    {
    dispatchEvent(new Event("ChangEtat"));
    }
    ]]>
    </fx:Script>
    L'état de base, début, correspond à DiapAccueil.mxml pourvu d'un datagrid.
    Comment rafraichir ce datagrid lorsque je viens de l'état State2 (le document DiapAccueil.mxml est déjà chargé donc ma fonction sur "creationComplete" n'est pas utilisée)?
    J'ai essayé d'insérer une fonction dans la fonction "affEtat1" mais je n'arrive pas à faire référence au datagrid (ni au dataprovider défini en Bindable) sur DiapAccueil.mxml. Pourriez-vous me donner une piste ?

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    208
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 208
    Par défaut
    Si je comprends bien ton problème tu veux rafraichir ton datagrid quand tu viens du composant Diapob (tu n'as pas de State2) ?

    Utilises-tu un modèle MVC ?
    Si oui, il te suffirait d'avoir ton modèle avec une liste d'objets qui correspondrait au dataprovider de ta datagrid.
    Tu n'aurais qu'à avoir une fonction de ton modèle du type refreshList(), que tu appellerais au moment ou tu quitte ton état.

    Une autre solution, beaucoup "sale", serait de rechercher "à la mano", du type :
    parent.diapoAccueil.monDatagrid.dataProvider et de travailler dessus. A éviter.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    248
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 248
    Par défaut
    C'est exactement ça!

    Un modèle MVC? Je regarde ce que c'est!
    Si je comprends bien (à mon tour!), j'utilise ce modèle pour tout ce qui est : échange avec la base de données sqlite. Par exemple, le dataprovider en question est un arrayCollection issu de :
    Ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    import BO.Sonde;
    public function listeSondes():Array
    {
    var result:SQLResult = this.executeQuery(SQLMode.READ, "SELECT * FROM SONDE", null, Sonde);
     
    if(result != null)
    {
    	return result.data == null ? new Array() : result.data;
    }
    return null;
    }
    Il me faut appeler cette méthode pour rafraichir le dataprovider.
    Elle est accessible de n'importe où. Par contre c'est le dataprovider qui ne l'est pas d'où peut-être l'emploi de la solution sale?

    J'essaye!

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    208
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 208
    Par défaut
    Je te déconseille quand même la solution "pourrie".

    En gros, avec le modèle MVC (il y a plein de frameworks qui l'utilisent, pour ma part j'utilise Swiz), tu pourras utiliser des classes, dans lesquels tu mettras le résultat de ta fonction.

    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    //classe dite presentation model
    public var presentationModel:PresentationModel;
     
    //ta fonction utilisée au bon moment, une fois que ta classe
    //presentationModel est instanciée
    public function listeSondes():Array
    {
    var result:SQLResult = this.executeQuery(SQLMode.READ, "SELECT * FROM SONDE", null, Sonde);
     
    //acData, est un ArrayCollection défnit dans PresentationModel, et bindable
    presentationModel.acData = result.data;
    }
     
     
    /**
     * Code dans ta vue DiapoAccueil.mxml
     */
    <s:Datagrid ... dataProvider="{presentationModel.acData}" />
     
     
    /**
     * Code au changement d'état, listeSondes est lancée, et remplie l'ArrayCollection. Comme celui-ci est bindable, ton Datagrid est à jour.
     */
    ...
    maClasse.listeSondes();
    ...

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    248
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 248
    Par défaut
    Autre alternative :
    Le dataGrid est remplit avec la fonction listeSonde sur initialisation de l'état "debut".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    private function start():void
    	{	
    	var retourListe:Array = Database.Instance.listeSondes();
     
    	if(ReturnedList != null){		
    		dpSondes = new ArrayCollection(retourListe);	
    	}	
    }
    J'utilise la même fonction sur l'évènement : "addedToStage" donc dès qu'il apparait, le datagrid est actualisé et ... Hey hey hey! ça marche!

    Merci pour ton aide Marty (j'ai bien saisi l'importance du MCV)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AIR] Gestion de la mémoire des states
    Par shagun dans le forum Flex
    Réponses: 0
    Dernier message: 07/10/2011, 12h02
  2. [reseaux] Gestion des threads en perl
    Par totox17 dans le forum Programmation et administration système
    Réponses: 2
    Dernier message: 28/11/2002, 09h40
  3. Gestion des variables - mémoire ?
    Par RIVOLLET dans le forum Langage
    Réponses: 4
    Dernier message: 26/10/2002, 12h44
  4. Réponses: 4
    Dernier message: 04/07/2002, 12h31
  5. c: gestion des exceptions
    Par vince_lille dans le forum C
    Réponses: 7
    Dernier message: 05/06/2002, 14h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo