javascript - 将元素添加到 d3 中的数组

标签 javascript d3.js force-layout

我正在创建一个网页,该网页将使用 JSON 文件中的数据制作 d3 强制布局图,当按下按钮时,系统将提示用户输入名称,并使用提供的名称创建一个新节点姓名。页面加载成功,当按下按钮时,警报会要求输入名称,但是当输入名称时,会出现错误,提示“未捕获的类型错误:未定义不是函数”,并且未添加新节点。

我可以做什么来修复这个错误?使用 Chrome,我知道错误发生在我尝试附加 newNode 的行中。这是我的代码:

<button onclick="addNode()">Click to add Node</button>
<script src="http://d3js.org/d3.v3.min.js"></script>
<script>

function addNode() {
  var nodeName = prompt("Name of new node:");
  var newGroup = Math.floor(Math.random() * 6);
  if (nodeName != null) {
    var newNode = {"node":{"name":nodeName,"group":newGroup}};
    force.nodes.append(newNode);
    force.start();
  }
}

var width = 960,
    height = 500;

var color = d3.scale.category20();

var force = d3.layout.force()
    .charge(-120)
    .linkDistance(30)
    .size([width, height]);

var svg = d3.select("body").append("svg")
    .attr("width", width)
    .attr("height", height);

d3.json("user_interactions(1).json", function(error, graph) {
  force
      .nodes(graph.nodes)
      .links(graph.links)
      .start();

  var link = svg.selectAll(".link")
      .data(graph.links)
      .enter().append("line")
      .attr("class", "link")
      .style("stroke-width", function(d) { return Math.sqrt(d.value); });

  var node = svg.selectAll(".node")
      .data(graph.nodes)
      .enter().append("circle")
      .attr("class", "node")
      .attr("r", 5)
      .style("fill", function(d) { return color(d.group); })
      .call(force.drag);

  node.append("title")
      .text(function(d) { return d.name; });

  force.on("tick", function() {
    link.attr("x1", function(d) { return d.source.x; })
        .attr("y1", function(d) { return d.source.y; })
        .attr("x2", function(d) { return d.target.x; })
        .attr("y2", function(d) { return d.target.y; });

    node.attr("cx", function(d) { return d.x; })
    .attr("cy", function(d) { return d.y; });
  });
});

</script>

最佳答案

force.nodes 是一个返回节点数组的函数。这不是属性(property)。所以 force.nodes.append 没有任何意义。您可能想将新节点添加到数据中,

force.nodes(force.nodes().push(newNode));

但是,我不确定 D3 是否能够优雅地动态处理节点数组的更改。

无论如何,您都必须为新节点添加 SVG 元素,并以类似于设置初始属性的方式指定其属性(rfill 等)

关于javascript - 将元素添加到 d3 中的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24147371/

相关文章:

javascript - 将值传递给数据库并使用 100% JavaScript 查看它?

javascript - DC js 复合图表工具提示

JavaScript d3 将参数传递给引用 d3.event.y 的函数

graph - 基于大小的充电 - d3 力布局

javascript - 打印数组列表时遇到问题

JavaScript 字符串 : get content of two standing next to each other pieces of content and wrap them together

javascript - 如何缩小AngularJS中的字符串数据组?

javascript - 嵌套选择不更新

database - 深度可遍历的 self 中心图的缓存策略

javascript - 强制从分配的 SVG 大小绘制有向图