是否可以在data.enter()方法中使用data.enter()方法?

时间:2015-03-05 21:06:02

标签: javascript d3.js

我认为标题是不言自明的。

让我们说我输入这样的div并使用每个div创建一个单独的输入级联:

var rects = g.selectAll("rect").data(data);

  rects.enter()
    .append("rect")
    .attr("width","100px")
    .attr("height","100px")
    .attr("y",function(d,i){ return margin.top + (i * spacing) + "px"})
    .attr("x",margin.left + "px")
    .attr("fill", function(d) { return "d.color" }
    .each(function(d,i){
      var that = d3.select(this)
         that.selectAll('circle.timelinefeatures')
           .data(allevents)
           .enter()
             .append('circle')
              .attr('class',"timelinecircles")
            });

这是正确的做法吗?

1 个答案:

答案 0 :(得分:3)

我认为来自d3的selection.data(values, key) API参考的这个例子说明了这一点:

  

values 数组指定选择中每个组的数据。因此,如果选择具有多个组(例如d3.selectAll后跟selection.selectAll),则应将数据指定为返回数组的函数(假设您希望每个组使用不同的数据) 。该函数将传递当前组数据(或undefined)和索引,并将该组作为this上下文。例如,您可以将二维数组绑定到初始选择,然后将包含的内部数组绑定到每个子选择。在这种情况下,values函数是identity函数:它为每个子元素组调用,传递绑定到父元素的数据,并返回该数据数组。

var matrix = [
  [11975,  5871, 8916, 2868],
  [ 1951, 10048, 2060, 6171],
  [ 8010, 16145, 8090, 8045],
  [ 1013,   990,  940, 6907]
];

var tr = d3.select("body").append("table").selectAll("tr")
    .data(matrix)
  .enter().append("tr");

var td = tr.selectAll("td")
    .data(function(d) { return d; })
  .enter().append("td")
    .text(function(d) { return d; });

另请参阅:https://github.com/mbostock/d3/wiki/Selections#selectAll

var rects = g.selectAll("rect").data(data);
rects.enter().append("rect");

var tf = rects.selectAll('circle.timelinefeatures').data(function(d, i) {
    return d;
});
tf.enter().append('circle').attr('class', 'timelinefeatures');