当前位置:  开发笔记 > 编程语言 > 正文

对可重用图表的一些澄清

如何解决《对可重用图表的一些澄清》经验,为你挑选了1个好方法。

在" 迈向可重复使用的图表 "中,迈克在最后列出了一个示例时间序列图表.在其中,他有这条线:

// Select the svg element, if it exists.
var svg = d3.select(this).selectAll("svg").data([data]);

这发生在可重用图表对象的定义中.我很难掌握这个陈述.

    首先,为什么要使用select(this)?是this上下文图表对象的当前实例?如果是这样,为什么还要麻烦,为什么不继续选择页面上的svg元素呢?

    为什么selectAll?每个图表对象不对应一个图表吗?

    为什么[data],而不仅仅是data,像我见过的大多数其他例子一样?此外,为什么我们将数据绑定到svg元素,而不是(比如说)路径元素?

我会感激任何帮助.



1> musically_ut..:

如本文中所定义的,可重复使用的图表可用于图表插入任何DOM元素,可能在同一页面上多次,尽管有所不同data.此外,由于您已指出的语句,它可用于更新已存在于DOM元素中的图形.它的使用方式是(来自文章):

var formatDate = d3.time.format("%b %Y");

var chart = timeSeriesChart()
             .x(function(d) { return formatDate.parse(d.date); })
             .y(function(d) { return +d.price; });

// Put the chart _inside_ #example1
d3.select("#example1")
  .datum(data1)
  .call(chart);

// Put the same chart _inside_ #example2
d3.select("#example2")
  .datum(data1)
  .call(chart);

// Update the data for #example1, without appending another  element
setInterval(function () {
    d3.select("#example1")
      .datum(data2)
      .call(chart);
}, 5000);

现在解决你对它如何做到这一点的担忧:

    首先请注意,此代码在内部运行selection.each(...).根据API参考,.each中的this上下文是DOM元素.API参考文献进一步说:

    通过在回调函数中使用d3.select(this),可以使用每个运算符递归地处理选择.

    所以d3.select(this)只返回一个d3.selection只包含当前DOM元素的元素,它可能包含也可能不包含其中的元素.选择页面上的/每个元素不会产生非常可重复使用的图表,因为它会使整个页面混乱,而不是只有您想要图表出现的DOM元素.

    使用selectAll创建一个新的元素分组供D3工作,相反select,保留原始分组.有关嵌套选择如何工作的更多详细信息,请参阅此文章.并且,是的,你是对的,selectAll这里的组将用于创建或仅更新一个元素,这将我们带到下一个点.

    D3背后的一个基本概念是数据连接,其中数据数组以一对一的方式连接到一组DOM元素.在这种情况下,我们有兴趣将一些元素附加/更新到一个元素.使用为我们提供了一个可以绑定到一个元素的单元素数组.或者,这可以写成:data[data]

  var svg = d3.select(this).selectAll("svg").data([1]); // No `data`

   // Update the area path.
   g.select(".area")
      .data(data)    // Specifying data explicitly
      .attr("d", area.y0(yScale.range()[0]));

   // Update the line path.
   g.select(".line")
      .data(data)   // Specifying data explicitly
      .attr("d", line);

但是,通过将数据绑定到元素,使子选择已经可用的数据更令人高兴.

推荐阅读
U友50081205_653
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有