在D3强制布局中使用数据(...)来更新图形

时间:2013-09-23 16:22:52

标签: d3.js force-layout

我正在使用D3强制布局并添加代码以允许用户选择单个节点(此处,select与D3 select()无关,但从用户的角度指示节点的突出显示状态)。一次只能选择一个节点。因此,当用户点击未选择的节点时,我想取消选择任何选定的节点。

我在节点上使用了一个选定的属性,并努力使用D3数据(...)或数据(...)方法进行设置。事实上,我无法让它像那样工作。我现在所拥有的似乎有些笨拙,所以我希望有一种更清洁的方式。

function deselectAll() {
    var sc = d3.selectAll("circle")
        .filter(function(d) {return (d.selected == "y")});

    var circles = sc.data();

    sc.transition()
        .duration(50)
        .style("stroke-width", "1px")
        .style("stroke", "#3182bd");

    if(null != circles && circles.length > 0) {
        for(i=0; i<circles.length; i++) {
            circles[i].selected = "n";
        }
    }
}

问题是向链中添加.data(“n”)不会将“selected”设置为“n”。是否有可能将其作为d3链的一部分?

1 个答案:

答案 0 :(得分:2)

d3中的许多选择(或转换)函数将当前数据从每个节点传递到您定义的函数。您可以随时修改此数据的内容。

使用您的示例,如果您要将d.selected == "y"的节点从“y”设置为“n”,则可以使用过滤后的选择:

sc.each(function(d) {
    d.selected = "n";
});

对于选择中的每个节点,将调用此函数一次(根据您的过滤器选择“y”),这样您就可以简单地更改基准面上的属性值。