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

Bibliothèques & Frameworks Discussion :

Recharger un Tree [Dojo]


Sujet :

Bibliothèques & Frameworks

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Avril 2005
    Messages
    307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2005
    Messages : 307
    Par défaut Recharger un Tree
    Bonjour à tous,

    Décidement mes débuts avec Dojo sont chaotiques.Je voudrais pouvoir recharger un widget Tree après un clic sur un bouton.

    J'ai donc une liste de boutons qui correspondent à la version des données à afficher dans le tree. L'url pour récupérer les données (JSON) va changer en fonction de cette version. Elle est de la forme "plans/v{version}" (par exemple "plans/v1" pour la version 1).
    Le clic sur le bouton doit donc mettre à jour mon JSonRestStore avec la bonne url puis recharger le widget Tree.

    Mais je n'y arrive pas...

    Voici comment je créé mon Store et mon Tree
    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
    28
    29
    30
    31
    32
    // Create the store
    this.planItemsStore = new dojo.store.JsonRest({
    	target:this.planItemsStoreTarget,
    	clearOnClose:true,
    	getChildren: function(object, onComplete, onError){
    		//...
    	},
    	getLabel: function(object){
    		//...
    	},
    	getRoot: function(onItem, onError){
    		//...
    	},
    	mayHaveChildren: function(item){
    		//...
    	},
    });
     
    // Create the tree
    this.planTree = new dijit.Tree({
    	model: this.planItemsStore, // give it the model
    	openOnClick:true,
    	getIconClass: function(item, opened) {
    		//...
    	},
    	onClick:dojo.hitch(this, function(item, node, evt){
    		//...
    	}),
    },
    "tree"); // target HTML element's id
     
    this.planTree.startup();
    Voici comment je mets à jour this.planItemsStore.target :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.planItemsStore.target = "ma_nouvelle_url";
    J'ai trouvé ce bout de code sur Internet pour rafraichir un Tree :
    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
    // Credit to this discussion: http://mail.dojotoolkit.org/pipermail/dojo-interest/2010-April/045180.html
    // Close the store (So that the store will do a new fetch()).
    this.planTree.model.store.clearOnClose = true;
    this.planTree.model.store.close();
     
    // Completely delete every node from the dijit.Tree     
    this.planTree._itemNodesMap = {};
    this.planTree.rootNode.state = "UNCHECKED";
    this.planTree.model.root.children = null;
     
    // Destroy the widget
    this.planTree.rootNode.destroyRecursive();
     
    // Recreate the model, (with the model again)
    this.planTree.model.constructor(this.planTree.model);
     
    // Rebuild the tree
    this.planTree.postMixInProperties();
    this.planTree._load();
    Mais j'obtiens l'erreur suivante :
    this.planTree.model.store is undefined
    Quelqu'un a-t-il déjà rencontré le même problème?

  2. #2
    Membre Expert
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Âge : 57

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Par défaut
    Salut,

    Le code que tu as trouvé est gênant: il fait notamment appel à des fonctions privées.

    A mon avis l'idéal est de détruire l'ensemble (via l'appel du destroy sur ton tree, puis delete, et enfin même démarche sur le store) et de le refabriquer. Ce n'est pas délirant étant donné qu'il faut de toute façon reconstruire le store et le model puis enfin l'arbre...

    ERE

  3. #3
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Avril 2005
    Messages
    307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2005
    Messages : 307
    Par défaut
    Bonjour,

    Reconstruire complètement l'arbre est la 1ère chose que j'ai essayé. Mais cela m'a posé quelques problèmes:
    1. Le nœud racine (mon div contenant l'arbre) est supprimé quand j'appelle la méthode destroy()
    2. En admettant que je reconstruise le nœud détruit, lorsque que je fais appelle de nouveau à la méthode createTree(), j'obtiens une erreur du type "un widget ayant l'id 'tree' est déjà référencé"
    Comment donc recréer un widget avec le même id ?

  4. #4
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Avril 2005
    Messages
    307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2005
    Messages : 307
    Par défaut
    Bon effectivement j'ai réessayé et ça marche. J'avais dû oublier quelque chose, mais quoi ?

    Bref voici comment je procède maintenant : je n'appelle plus de methode refreshTree(), mais uniquement createTree(). Et à chaque appel de createTree() je vérifie que this.planItemsTree n'existe pas déjà, et si c'est le cas je le détruit.
    Au final voici le résultat :
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    controllers.PlanController = {
    	//...
    	createTree:function(){
    		// Destroy the store and the tree if already exists
    		this.destroyTree();
     
    		// Create the dom node is not exists
    		if(dojo.byId("tree")==null){
    			dojo.create("div", {id:"tree"}, dojo.byId("systems"));
    		}
     
    		// Create the store
    		this.planItemsStore = new dojo.store.JsonRest({
    			target:this.planItemsStoreTarget,
    			clearOnClose:true,
    			getChildren: function(object, onComplete, onError){
    				//...
    			},
    			getLabel: function(object){
    				//...
    			},
    			getRoot: function(onItem, onError){
    				//...
    			},
    			mayHaveChildren: function(item){
    				//...
    			},
    		});
     
    		// Create the tree
    		this.planTree = new dijit.Tree({ // create a tree
    			model: this.planItemsStore, // give it the model
    			openOnClick:true,
    			getIconClass: function(item, opened) {
    				//...
    			},
    			onClick:dojo.hitch(this, function(item, node, evt){
    				//...
    			}),
    		},
    		"tree"); // target HTML element's id
    	},
    	destroyTree:function(){
    		if(this.planItemsStore!=null){
    			this.planItemsStore = null;
    		}
     
    		if(this.planTree!=null){
    			this.planTree.destroyRecursive(true);
    			this.planTree = null;
    		}
    	},
    	//...
    }
    Je crois que tu envois des ondes positives Emmanuel... ^^
    Merci encore pour ton aide trèèèèès précieuse.

  5. #5
    Membre Expert
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Âge : 57

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Par défaut Petites précisions
    Salut,

    Quelques précisions: d'abord attention à ne pas confondre Model et Store. Tu écris:
    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
    28
    29
    		// Create the store
    		this.planItemsStore = new dojo.store.JsonRest({
    			target:this.planItemsStoreTarget,
    			clearOnClose:true,
    			getChildren: function(object, onComplete, onError){
    				//...
    			},
    			getLabel: function(object){
    				//...
    			},
    			getRoot: function(onItem, onError){
    				//...
    			},
    			mayHaveChildren: function(item){
    				//...
    			},
    		});
     
    		// Create the tree
    		this.planTree = new dijit.Tree({ // create a tree
    			model: this.planItemsStore, // give it the model
    			openOnClick:true,
    			getIconClass: function(item, opened) {
    				//...
    			},
    			onClick:dojo.hitch(this, function(item, node, evt){
    				//...
    			}),
    		}
    D'abord, tu vois que tu affectes un Store là où ce qui est attendu est un Model. Ok tu as ajouté les fonctions de l'interface Model dans le constructeur du Store mais c'est un peu casse-gueule: rien ne dit que la prochaine implémentation de ce store fera encore un mixin... Tu devrais plutôt écrire cet objet à part et ensuite faire le mixin avec ton Store ou bine faire un dojo.extend de dojo.store.JsonRest, ou encore mieux créer une nouvelle classe qui hérite de dojo.store.JsonRest ET de ton implémentation de Model. Je sais cela peut paraitre compliqué mais c'est ce qui t'assure un peu plus d'évolutivité ou de réutilisation de ton code (pour quasi aucune modif dans les deux premiers cas).

    Ensuite attention à ne pas confondre dojo.data avec dojo.store. Ce sont l'ancienne et la nouvelle API. Or le clearOnClose n'existe pas dans le dojo.store, tu dois donc pouvoir l'enlever, il ne fait ici que décorer .

    Pour être complet on peut noter que la version 1.7 de Dojo ne propose pas une implémentation du Model basée la nouvelle api des store, mais uniquement sur l'ancienne. Dommage, même s'il existe des ponts entre les deux Api.

    Voilà, l'essentiel reste quand même que ton code fonctionne !

    ERE

    EDIT: je viens de m'apercevoir que ton code ressemble à un tutorial des Tree avec la 1.6. . Ceci explique peut-être mieux la mise en oeuvre du store que tu as faite

  6. #6
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Avril 2005
    Messages
    307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2005
    Messages : 307
    Par défaut
    Bonjour Emmanuel,

    Tout d'abord je te souhaite une excellente année 2012 ainsi qu'à tout le forum Développez.com. Je te remercie encore pour tes nombreuses contributions et aides que tu nous apportes.

    Effectivement j'ai repris le tutorial sur le site officiel de dojo. Ça me paraissait bizarre aussi, mais étant tout nouveau j'ai décidé de lui faire confiance ^^

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

Discussions similaires

  1. [XUL] Recharger un tree xul
    Par GregPeck dans le forum Autres langages pour le Web
    Réponses: 2
    Dernier message: 15/09/2006, 15h05
  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