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 :

mx:Tree et dataChange


Sujet :

Flex

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2006
    Messages : 141
    Points : 118
    Points
    118
    Par défaut mx:Tree et dataChange
    Bonjour,

    J'ai un Tree qui est rempli à l'aide d'un dataProvider.
    Lorsque je change les valeurs du dataProvider, le tree affiche bien les nouvelles valeurs mais ferme tout les nodes ouvert.

    Je pensais donc intercepter l'event dataChange du tree pour utiliser un Tree.openItems pour y réouvrir tout les nodes.

    Mais alors que je change les données de mon dataProvider, il ne passe par dans l'event dataChange.

    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <mx:Tree x="10" y="10" width="100%" height="100%" id="TreeGrid"
    dataChange="doTreeDataChange(event)"
    dataProvider="{model.getTreeDataResult}" 
    dataDescriptor="{new EdcTreeDataDescriptor()}"
    labelFunction="treeLabel" iconFunction="treeIcon"/>
    Des idées ?

    Merci

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Mai 2006
    Messages
    895
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 895
    Points : 1 710
    Points
    1 710
    Par défaut
    Bonjour,

    dataChange est un évènement appelé lorsque la propriété data est modifiée.

    When you use a component as an item renderer, the data property contains the data to display. You can listen for this event and update the component when the data property changes.
    The FlexEvent.DATA_CHANGE constant defines the value of the type property of the event object for a dataChange event.
    Or toi tu veux surveiller le dataProvider, je n'en suis pas très sûre mais il me semble que tu devrais utiliser l'évènement valueCommit.

    ++

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2006
    Messages : 141
    Points : 118
    Points
    118
    Par défaut
    Merci ellene,

    Il n'y a donc aucun évènements sur le changement du dataProvider d'un composant ?

    J'ai essayé le valueCommit mais il se déclenche tout le temps.
    Bon, je regarde encore.

  4. #4
    Membre expérimenté

    Profil pro
    Inscrit en
    Mai 2006
    Messages
    895
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 895
    Points : 1 710
    Points
    1 710
    Par défaut
    Bon j'ai relu la description de ton problème, tu dis :
    Lorsque JE change les valeurs du dataProvider, le tree affiche bien les nouvelles valeurs mais ferme tout les nodes ouvert.
    Si c'est toi qui le change tu n'as qu'à créer ton propre évènement et faire ton traitement. C'est le plus simple non ?

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2006
    Messages : 141
    Points : 118
    Points
    118
    Par défaut
    Pour t'expliquer vraiment mon problème je vais détailler mon code.

    Pour info, j'utilise weborb, mais bon c'est juste pour info, ça ne change rien à problème flex.
    j'ai donc mon tree qui est binder sur {model.getTreeDataResult}

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <mx:Tree id="TreeGrid" dataProvider="{model.getTreeDataResult}"/>
    Dans mon code je vais appeler la méthode qui remple le model.

    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
     
    [Bindable]
    private var model:EdcLayerModel = new EdcLayerModel();
    private var serviceProxy:EdcLayer = new EdcLayer(model);
     
    public function refreshTree():void {
        serviceProxy.getTreeData(new ItemResponder(resultGetTreeDataFunction, faultGetTreeDataFunction));
    }
     
    public function resultGetTreeDataFunction(result:Object, token:Object = null):void{
     
    }
     
    public function faultGetTreeDataFunction(error:Object, token:Object = null):void{
    }
    Le problème c'est que quand je rentre dans la méthode resultGetTreeDataFunction, le dataProvider du tree n'est pas encore mit à jour.

    Ce qu'il me faudrait c'est un event en fin de changement du dataProvider du tree.

    Sait-on mettre un évènement sur le dataProvider du tree ou bien sur le binding entre le dataProvider et le model.getTreeDataResult ?

  6. #6
    Membre averti Avatar de samy2525
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    259
    Détails du profil
    Informations personnelles :
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 259
    Points : 310
    Points
    310
    Par défaut
    Bonjour,

    j'ai déja essayé de résoudre ce problème mais je ne suis pas arrivé, je te laisse ce lien qui contient comment faire pour sauvegarder l'etat de tes noeuds aprés un update du dataprovider

    http://www.adobe.com/devnet/flex/qui...ing_with_tree/


    et cherche cette phrase

    Keep a Tree control open with the data provider is updated

    et si tu arrive tiens moi au courant ça m'interesse

    Bon courage

    Samy
    http://www.m-ataf.com (En cours de construction)

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2006
    Messages : 141
    Points : 118
    Points
    118
    Par défaut
    Bon .

    j'y suis arrivé, mais au prix de beaucoup de sueur et de larmes.

    J'ai mit le code sous l'événement render du tree.
    Le problème est que en mettant à jour le dataProvider du tree, on change les nodes (même s'ils sont pareils, Flex considère qu'ils ont changé)

    Dans mon cas, avant de mettre à jour le dataProvider de mon tree, je mémorise les openItems, par exemple dans mon cas j'aurais ceci :
    [0] = ConsignationORBLayer.vo.ITreeZone (@675de79)

    Or après mise à jour du dataProvider, ce même node aura comme signature :

    [0] = ConsignationORBLayer.vo.ITreeZone (@66ee159)

    Flex considère qu'il s'agit de deux nodes différents, donc, en associant le openItems précédent à mon tree, il n'ouvre pas les nouveaux nodes.

    Donc ce que je fais, je dois reconstruire un nouvel openItems sur base du nouveau dataProvider.

    Bref, ça fonctionne, mais c'est pas très beau comme code

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    793
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2009
    Messages : 793
    Points : 894
    Points
    894
    Par défaut
    Dans la mesure où tu change ta source de données je ne vois pas très bien comment le Tree pourrait retrouver les noeuds précédemment ouverts pour la simple et bonne raison que les données peuvent être totalement différentes.

    La seule solution est de faire ton propre traitement en sauvegardant les noeuds ouverts avant la modification de la source de données et en les restaurant ensuite.

    Je ne vois pas trop en quoi ce code "n'est pas très beau" !!!

    Tu veux dire que si ce même code était directement intégré au composant il serait plus beau !!!!!
    jyl@xx
    "Simplicity does not precede complexity, but follows it." Alan Perlis

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2006
    Messages : 141
    Points : 118
    Points
    118
    Par défaut
    Flex donne lui même aux nodes une clé unique.
    On pourrait très bien imaginer qu'une propriété du tree qui pourrait être du genre : uniqueIDField, pour spécifier une propriété unique des nodes qu'il pourrait utiliser en lieu et place de leur clé.

    Tu peux bien utiliser le labelField pour lui spécifier ce qui dans ton objet doit lui servir pour afficher son label, je vote pour que Adobe mette à côté du labelFiel une propriéte uniqueIDField

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    793
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2009
    Messages : 793
    Points : 894
    Points
    894
    Par défaut
    Il existe déjà tout un processus pour fournir un uid à chaque item d'une collection. Je t'invite à lire le code de cette fonction : UIDUtil.getUID()

    Il n'est donc pas nécessaire d'en faire davantage.

    Ce qui manque c'est la restauration des noeuds ouverts lors de la réaffectation du dataProvider.
    Adobe a fait le choix de réinitialiser les noeuds ouverts lors d'un changement de dataProvider, ce qui me semble raisonnable.
    jyl@xx
    "Simplicity does not precede complexity, but follows it." Alan Perlis

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2006
    Messages : 141
    Points : 118
    Points
    118
    Par défaut
    Comme tu le dis, Adobe a fait le choix, tout à fait justifiable, de fermer les noeuds ouvert lors du changement du dataprovider.

    Et Adobe fournit une propriété (openItems) pour restaurer les noeuds ouvert.
    Le seul problème est quand pratique, cette propriété est unitilisable parce que le rechargement du dataProvider modifie les UID des éléments de la collection.

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    793
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2009
    Messages : 793
    Points : 894
    Points
    894
    Par défaut
    Les uid ne changent pas si c'est toi qui les fournit dans les propriétés de tes données !
    jyl@xx
    "Simplicity does not precede complexity, but follows it." Alan Perlis

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2006
    Messages : 141
    Points : 118
    Points
    118
    Par défaut
    Si ce qu'à quoi je pense fonctionne ..je te vénérerais jusque la fin de mes jours et même après

  14. #14
    Membre à l'essai
    Profil pro
    Développeur Web
    Inscrit en
    Avril 2004
    Messages
    17
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2004
    Messages : 17
    Points : 21
    Points
    21
    Par défaut
    Citation Envoyé par vilveq Voir le message
    Si ce qu'à quoi je pense fonctionne ..je te vénérerais jusque la fin de mes jours et même après
    Je déterre le POST.

    As-tu mis en pratique ta pensé ?

    car j'ai un besoin similaire : ré-ouvrir les nœuds du <mx:Tree> apres MAJ de son DataProvider.

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2006
    Messages : 141
    Points : 118
    Points
    118
    Par défaut
    Citation Envoyé par nemohp Voir le message
    Je déterre le POST.

    As-tu mis en pratique ta pensé ?

    car j'ai un besoin similaire : ré-ouvrir les nœuds du <mx:Tree> apres MAJ de son DataProvider.
    Bonjour,

    Oui, cela fonctionne.
    Avant de faire le chagement du dataProvider du Tree tu dois mémoriser les noeuds ouvert :
    myTreeOpenNodes = myTrees.dataProvider.openNodes;

    le problème que j'avais était que pour Flex, les nouveaux nodes n'était pas les même que les anciens nodes. Fair l'opération inverse :

    myTrees.dataProvider.openNodes = myTreeOpenNodes;

    ne fonctionnait pas.

    Or mes nodes ce sont des objets à moi. Ils ont un ID unique.
    Au besoin, je recrée donc un Array avec les nodes que je souhaite ouvrir.

    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
     
    // _r est mon array qui va recevoir les nodes à ouvrir
    var _r:Array = new Array();
    //Un curseur qui balaye le dataprovider du tree
    var dataCursor:IHierarchicalCollectionViewCursor = myTrees.dataProvider.createCursor();  
     
    while (dataCursor.current)  {  
    //je passe en revue tout les openNodes mémorisé précédement
      for each ( var item:Object in myTreeOpenNodes ){  
    // je regarde si les ID corresponde, ce sont mes ID de mes objets
        if(item.id == dataCursor.current.id){
    _r.push(dataCursor.current);
    	    			break;
    	    		}
    	    	}
    	    	dataCursor.moveNext();
    	    }
    	//    AdvancedgridConsignes.validateNow();
    	//    IHierarchicalCollectionView(AdvancedgridConsignes.dataProvider).openNodes = _r;  
    		AdvancedgridConsignes.dataProvider.openNodes = _r;

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2006
    Messages : 141
    Points : 118
    Points
    118
    Par défaut
    Citation Envoyé par nemohp Voir le message
    Je déterre le POST.

    As-tu mis en pratique ta pensé ?

    car j'ai un besoin similaire : ré-ouvrir les nœuds du <mx:Tree> apres MAJ de son DataProvider.
    Bonjour,

    Oui, cela fonctionne.
    Avant de faire le chagement du dataProvider du Tree tu dois mémoriser les noeuds ouvert :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    myTreeOpenNodes = myTrees.dataProvider.openNodes;
    le problème que j'avais était que pour Flex, les nouveaux nodes n'étaient pas les mêmes que les anciens nodes. Faire l'opération inverse :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    myTrees.dataProvider.openNodes = myTreeOpenNodes;
    ne fonctionnait pas.

    Or mes nodes ce sont des objets à moi. Ils ont un ID unique.
    Au besoin, je recrée donc un Array avec les nodes que je souhaite ouvrir.

    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
     
    // _r est mon array qui va recevoir les nodes à ouvrir
    var _r:Array = new Array();
    //Un curseur qui balaye le dataprovider du tree
    var dataCursor:IHierarchicalCollectionViewCursor = myTrees.dataProvider.createCursor();  
     
    while (dataCursor.current)  {  
    //je passe en revue tout les openNodes mémorisé précédement
      for each ( var item:Object in myTreeOpenNodes ){  
    // je regarde si les ID corresponde, ce sont mes ID de mes objets
        if(item.id == dataCursor.current.id){
           _r.push(dataCursor.current);
           break;
         }
       }
       dataCursor.moveNext();
    }
    // je reouvre les nodes du tree
    myTrees.dataProvider.openNodes = _r;
    Voilà, j'espère que cela à pu t'aider

  17. #17
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Points : 1 234
    Points
    1 234
    Par défaut
    Moi j'aurais vraiment besoin de pouvoir réagir à un changement de data provider (et même à sa première affectation) est-ce possible ?

    Merci.
    Most Valued Pas mvp

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

Discussions similaires

  1. [MX2004] Tree
    Par freegreg dans le forum Flash
    Réponses: 4
    Dernier message: 09/01/2004, 15h25
  2. Tree View avec XML et XSL
    Par Drooxy dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 22/04/2003, 10h21
  3. pb formatage document XML généré par un dom tree
    Par lionel69 dans le forum APIs
    Réponses: 11
    Dernier message: 17/10/2002, 09h53
  4. BTREE & B+TREE
    Par TuxP dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 09/08/2002, 17h27
  5. Recherche algo tree
    Par Anonymous dans le forum Algorithmes et structures de données
    Réponses: 10
    Dernier message: 24/05/2002, 13h44

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