d3j:删除数据集

时间:2015-02-09 17:29:29

标签: javascript d3.js

我想在取消选中复选框时删除曲线。我试了这个没有成功:

function drawdata(fileno,draw){
    var name="circle"+fileno;
    if (draw) {
        console.log("Drawing file "+fileno+ " ("+files[fileno]+")");
        svg.selectAll(name) .data(datasets[fileno]) .enter() .append("circle")
        .attr('cx',function(a){ return xscales[xval](a[xval]); })
        .attr('cy',function(a){ return yscales[yval](a[yval]); })
        .attr('r',3)
        .style("opacity", 1)
        ;
    } else {
        console.log("removing file "+fileno);
        svg.selectAll(name).data(datasets[fileno]).exit().remove();
    }
}

第一部分效果很好(例如,如果我选中一个复选框,那么就会绘制文件)但是当我取消选中它时,它不会从svg中删除。我想我不太了解出口。有人可以指出出了什么问题吗?感谢。

示例jsfiddle代码: http://jsfiddle.net/datavis/530h1qLw/11/#&togetherjs=Rkz5QyDgJm

1 个答案:

答案 0 :(得分:1)

更新

随着小提琴的加入,很容易看出发生了什么。当你执行svg.selectAll(name)时,它会返回一个空的选择。原因是因为circleN没有元素。 circleN不是有效的DOM元素,并且无论如何都不存在,因此选择将失败。

如果您对cds功能进行了以下更改,您会看到您的代码现在正常运行:

function cds(el) {
    name = "circle" + el.id;
    if (el.checked) {
        svg.selectAll(name)
            .data(dataset[el.id])
          .enter().append("circle")
            .attr('cx', function (a) { return xscale(a[0]); })
            .attr('cy', function (a) { return yscale(a[1]); })
            .attr('r', 3)
            .attr('class', name)        
            .style("opacity", 1);
    } else {
        svg.selectAll("circle." + name).remove();
    }
} 

此功能有两处注释:

  1. .attr('class', name)被添加到创建新DOM元素的代码中。这将为圆圈添加一个类,使其在删除时更容易选择。
  2. 更新了将其移至svg.selectAll("circle." + name).remove();的行,当您取消选中广播框时,该行将删除圈子。