【发布时间】:2016-05-07 05:08:01
【问题描述】:
我为每个数据项创建了一个 SVG 元素。现在我想将一个路径元素附加到每个 svg,但是当我更新数据时,它不会使用相同的元素,而是复制它。如何防止这种情况发生?
我的数据如下所示:
var dataset = [
{"id": 1, "goalPct": 1, "curPct": 0.5},
{"id": 2, "goalPct": 1, "curPct": 0.25},
{"id": 3, "goalPct": 1, "curPct": 0.74}
];
var dataset2 = [
{"id": 1, "goalPct": 1, "curPct": 0.74},
{"id": 2, "goalPct": 1, "curPct": 0.5},
{"id": 3, "goalPct": 1, "curPct": 0.25}
];
现在,我根据这些数据创建了一个 svg 元素。这就像它应该在更新调用时一样工作(当我推送新数据时),它不会重复。代码:
var svg = container.selectAll("svg").data(data);
svg.enter()
.append("svg");
svg.exit().remove();
svg.transition().duration(750)
从这里开始,我想将路径元素附加到这些 svg 元素,但是当我推送新数据时,它只是附加一个新路径元素,而不是用新数据更新它。我不能对路径元素使用 .data(data) 函数,因为如果这样做,它会为 each svg 上的每个数据元素创建一个路径。 (例如,如果我有 2 个数据元素和 3 个 svg,它将在 3 个 svg 的每一个上创建 2 个路径元素)。代码:
var arc = svg.append("path")
.attr({
"d": function (d, i) {
bronzeArc.endAngle((2 * Math.PI) * d.CurPct);
return bronzeArc();
}
});
我试过移动 svg.exit().remove();周围,这对我没有任何帮助。有什么建议吗?
【问题讨论】:
-
我不太确定我是否遵循您想要实现的目标。你能把它放在codepen或jsfiddle上吗?
-
@rcheuk jsbin.com/wiqalixudu/edit?js,output 如果你能够 F12 会更有意义,因为当我说它正在堆积元素时,你将能够看到我在说什么。本质上,这 2 个圆应该交换角度,但只有 1 个圆在改变,因为这些元素只是相互堆叠。 1 发生变化的原因是因为新数据大于上一个。从那以后是不是又赚了一点?
标签: javascript jquery d3.js svg