0

我有一些 d3 代码可以选择并附加一个“网关”对象数组,如下所示:

var gwList = chart.selectAll('.gw')
             .data(gateways);

gwList
  .enter()
  .append('svg:g')
  .attr('class', 'gw')  // the CSS class to use. Change this!
  .append("svg:path")   // append a path only for each new object, with class 'line'
  .attr("class", "line")
  .attr("clip-path", "url(#clip)")
  .datum(function(d, i) {
      return {object: d, timeValues:null};
  });

注意 .datum() 调用。我希望条目选择元素用具有 2 个属性的对象替换它们的网关对象。

然后我做:

gwList
    .selectAll('path.line')
    .data(function(d) {
        // stuff
    });

我无法弄清楚的是,即使我对入口节点进行了“datum()”调用,较低的 .data() 函数中“d”的值始终是原始网关对象,而不是修改后的内部对象. 'this' 的值是路径元素的选择数组,它们确实具有正确的数据值。我如何检索它,为什么它不在 (d) 中?

d[0].__data__ // gives the right answer
d.data() is an error about object [object Array] has no method 'data'
d[0].data() Object #<SVGPathElement> has no method 'data'

我试过找到一个 selection.datum 的例子,但还没有看到一个可以解释这一点的例子。有人可以告诉我这里发生了什么吗?

4

1 回答 1

0

弄清楚了。而不是在selectAll('path.line')之后的部分中调用'data()',我需要调用'each'或'call'。正确地将子选择的数据传递给函数。

于 2013-03-14T01:26:16.787 回答