Comment se débarrasser des requêtes AJAX récursives pour un nœud sans enfant?

Problème:

Selon l’auteur, la documentation jsTree :

Lors de l’ouverture d’un nœud fermé (sans enfants chargés), une demande AJAX est effectuée.

Comment configurer jsTree pour se débarrasser de ces demandes de données AJAX effectuées pour chaque nœud vide / sans enfant? Je veux que mes nœuds vides restnt vides (ou sans enfant)!


Donné (simplifié):

Conteneur de données JSON ( data.json )

{ "data" : "Root node with no children", "children" : [] } 

Configuration de jsTree

 { "json_data" : { "ajax" : { "url" : "data.json", "type" : "GET", "dataType" : "json", "dataFilter" : function (data, type) { //some filtering function } } }, "plugin" : ["json_data"] } 

Marquez l’état du nœud feuille comme “feuille”. Cela devrait résoudre le problème.

J’ai eu ce problème en définissant l’atsortingbut state = “closed” sur des nœuds sans enfant pour les arbres XML. Supprimer l’atsortingbut d’état résout le problème.

J’ai eu un problème similaire il y a quelques semaines. J’ai eu un appel de fonction dans le champ “url”, ce qui a finalement conduit à du code Java qui a créé une chaîne JSON basée sur une requête SQL. Ainsi, lorsque j’ai cliqué sur un nœud fermé sans enfant, la fonction a été appelée à nouveau, ce qui a créé un arbre sans fin.

la façon dont j’ai résolu ceci était:

 "json_data" : { "ajax" : { "url" : "getAreaTree?treeType=Areas&ownerPhone=<%=webSessionObject.getUserPhoneNum()%>", "data" : function (n) { return { id : n.attr ? n.attr("id") : 0 }; } } }, 

Le résultat de la fonction définie dans “data” sera ajouté en tant que paramètre à la fonction “url”. Ensuite, je peux vérifier si le paramètre était 0 (charge initiale) ou 1 (l’identifiant de ma racine) ou quelque chose d’autre.

Si cela ne fonctionne pas pour vous, vous pourriez peut-être essayer quelque chose comme ceci:

 .bind("before.jstree",function(event,data){ if(data.func === "create"){ var foo = true; data.inst._get_node(null, true).each(function () { if(this.id!=rootId && this.id!=0){ foo = false; }) if(!foo){ event.stopImmediatePropagation(); return false; } } }) 

Je ne suis pas vraiment sûr que cela fonctionne bien. “before.jstree” se déclenche avant tous les événements. Je vérifie si la fonction sur le sharepoint se déclencher est “créer”, et si c’est le cas, je vérifie l’identifiant du nœud sélectionné. S’il s’agit de quelque chose d’autre que l’id de ma racine ou 0 (charge initiale), j’arrête la fonction de création.

J’utilise une structure similaire pour une situation différente, donc quelque chose comme cela devrait fonctionner. Il se peut que l’événement “create” ne soit pas ce à quoi vous devriez être lié. Vous pouvez le changer pour

 .bind("before.jstree",function(event,data){ console.log(data.func) if(data.func === "create"){ 

Pour voir quelles fonctions sont appelées.

Sautez simplement l’atsortingbut enfants. De toute évidence, votre noeud n’a pas d’enfants, mais vous spécifiez l’atsortingbut? Ignorez-le simplement, le nœud sera rendu sous forme de nœud feuille et aucune autre demande ne sera faite.

J’ai eu du mal avec ce problème aussi. J’ai eu l’idée principale de jsTree – chargement de sous-noeuds via ajax à la demande

Le problème de base est que, lorsque nous cliquons sur un nœud enfant qui n’est pas défini sur feuille, une nouvelle demande AJAX est générée avec l’URL définie dans la configuration de l’arborescence. Le truc vu dans le lien ci-dessus est de fournir une fonction au lieu d’une chaîne d’URL statique. Mon jstree est utilisé pour afficher une structure de répertoires sur le serveur, ce qui me permet d’append dynamicment à l’URL des sous-répertoires. Si vous affectez une fonction à la propriété url de la propriété ajax dans votre configuration jstree, la fonction reçoit le nœud sur lequel vous avez cliqué comme argument. Mes nœuds affichent les noms de répertoires ou de fichiers afin que je puisse utiliser la fonction text () pour obtenir le nom de répertoire brut. Il semble y avoir un espace devant le nom renvoyé de cette manière. J’ai donc utilisé une fonction Ssortingng sortingm () puis encodeURIComponent pour me donner quelque chose que je puisse utiliser dans une URL.

Si -1 est passé à la fonction url, vous êtes à la racine et vous pouvez utiliser votre URL de base en toute sécurité. Maintenant, cela ne fonctionne que pour le premier niveau de la hiérarchie. J’ai encore un peu de travail à faire, en ajoutant le chemin d’access complet aux métadonnées du nœud ou quelque chose du genre, mais cette idée pourrait vous mettre sur la bonne voie. On dirait que ce n’est pas exactement un bug, mais de par leur conception. Vous devez vous assurer qu’une requête déclenchée par un sous-noeud envoie une URL appropriée au serveur.

Voici la propriété url que j’ai assignée à l’object ajax dans ma configuration jstree:

 "url": function (node) { var subDirectory = "", url = ""; if (node === -1) { url = "/tree_service/tree/format/json?path=exercises"; } else { subDirectory = encodeURIComponent(node.text().sortingm()); url = "/tree_service/tree/format/json?path=exercises/" + subDirectory; } return url; } 

Mon plan est de créer l’URL de manière cumulative en interrogeant le nœud pour connaître son chemin complet, puis en ajoutant le nom du nœud comme ci-dessus pour créer l’URL finale. Pseudo code:

 //haven't figured out how to add the path to the node and then resortingeve it path = node.metadata.path; path = encodeURIComponent(path); subDirectory = encodeURIComponent(node.text().sortingm()); url = path + "/" + subDirectory; 

UPDATE Voir ma réponse ici pour obtenir les métadonnées de jsTree. obtenir les métadonnées du noeud à l’aide de node.data (). path