2016-11-10 1 views
-1

Je travaille sur un graphe de mise en page de force d3, avec un aspect plutôt similaire à this. Ce que je veux, c'est que le nœud racine ne puisse pas être déplacé. J'ai corrigé le nœud racine dans le fichier json en ajoutantDéfinir une seule note de nœud (racine) pour être déplacée dans la disposition de force d3

"fixed": true 

mais il est encore draggable. Dans mon fichier JS il y a le code

var nodeEnter = node.enter().append("g") 
    .attr("class", "node") 
    .on("click", click) 
    .call(force.drag); 

Si je supprime la dernière ligne de ce code, le graphe entier ne draggable plus. Je pense que 'force' est une variable globale et détermine que tout le graphe est glissable. Mais je veux seulement que le nœud racine ne soit pas déplaçable et que le nœud soit déplaçable. Comment puis je faire ça?

+1

Avez-vous un exemple? J'ai testé ceci dans ce violon: http://jsfiddle.net/LtYnU/8/ remarquez dans la boucle que j'ai mis le premier à fixer. Cela fonctionne bien? – thatOneGuy

+0

Dans votre exemple, les nœuds ne sont pas déplaçables. Ajoutez .call (force.drag) dans la dernière ligne de votre code. Ensuite, tous les nœuds sont déplaçables et vous pouvez les déplacer avec votre souris. Je veux seulement que le noeud racine soit non-glissable et que le reste soit draggable. Est-ce clair ce que je veux dire? – papapple

+0

oh je vois, donnez-moi une seconde :) – thatOneGuy

Répondre

0

Vous devez supprimer l'événement glisser du noeud que vous souhaitez rester fixe.

Voici un exemple: http://jsfiddle.net/qvco2Ljy/112/

Je boucle à travers les données pour donner le premier élément d'un attribut fixe et aussi un attribut donotmove que lorsque vous faites glisser et lâcher prise, peut-être que vous voulez que le nœud de rester fixe (pour les enfants que je veux dire), donc l'utilisation d.fixed ici provoque un conflit:

graph.nodes.forEach(function(d, i) { 
    d.donotmove = false; 
    if (i == 0) {d.donotmove = true; d.fixed = true;} 
}) 

Et lors de l'appel des événements de glisser, vérifiez l'attribut donotmove comme ceci:

var drag = d3.behavior.drag() 
    .origin(function(d) { 
    return d; 
    }) 
    .on("dragstart", function(d) { 

    if (d.donotmove) return; 
    dragstarted(d) 
    }) 
    .on("drag", function(d) { 

    if (d.donotmove) return; 
    dragged(d) 
    }) 
    .on("dragend", function(d) { 

    if (d.donotmove) return; 
    dragended(d) 
    }) 

Espérons que ça aide :)

+0

Je voudrais analyser les données lorsque vous démarrez, c'est-à-dire en boucle, vérifiez si d.fixed == true; si c'est le cas, définissez d.donotmove sur true; puis utilisez cette valeur comme la vérification pour arrêter les conflits – thatOneGuy