2013-01-09 246 views
1

我正在尝试创建<g>元素foreach数据点,并在基于当前数据点的每个<g>元素中添加一对不同的<text>元素。我已经试过类似:d3.js嵌套选择

var g = vis.selectAll("g").data(dd,function(d){ return d.data.name+d.x+d.y+d.s; }); 

    var gs = g.enter().append("g");   
     g.exit().remove(); 

    var t = gs.selectAll("text").data(function(d) { console.log(d); return d; }); 
    t.enter().append("text").attr("x",function(d){ return d.x+d.s/2; }) 
     .attr("y",function(d){ return d.y+d.s/4; }) 
     .attr("font-family","Verdana") 
     .attr("font-size","9")   
     .attr("text-anchor","middle") 
     .text(function(d){ return d.data.name; });  

    t.attr("x",function(d){ return d.x+d.s/2; }) 
     .attr("y",function(d){ return d.y+d.s/4; }) 
     .attr("font-family","Verdana") 
     .attr("font-size","9")   
     .attr("text-anchor","middle") 
     .text(function(d){ return d.data.name; });  

    t.exit().remove(); 

但我得到的是一组空<g>元素。我做了什么明显错误?

回答

5

嵌套选择假定某种嵌套数据,例如,一个矩阵。您的个人数据元素不是数组,因此第二次调用.data()不会执行任何操作。查看tutorial on nested selections了解更多详情。

我不明白你为什么要在你的情况下嵌套选择。您正在添加一个显示数据点名称的text元素,因此您不需要第二个(嵌套)选择。修复它的最简单方法(至少在语法上)应该是将dd的每个元素更改为单元素数组。

+0

嗯,我简化了一下我的问题。我想为每个组添加一堆东西(几个文本元素,一个矩形等)。我已经使用扁平结构实现了它,我手动放置每个元素,但这会使转换不同步。我认为嵌套结构是有意义的,因为我基本上希望每个数据点都由一组项目表示。你对这类问题有什么建议? – user1167650

+0

这听起来不像嵌套选择会很有用 - 它们绝对无助于您的不同步转场。您可以尝试为转换设置自定义参数,甚至根据您要执行的操作编写自定义转换。请参阅[文档](https://github.com/mbostock/d3/wiki/Transitions)。 –

+0

暂且不论嵌套东西,如何可以附加多个元素,其中元件通过数据点的一些阵列创建的元件(即,元件进入/退出/更新等做内部元件进入) – user1167650