【问题标题】:Javascript library d3 call functionJavascript库d3调用函数
【发布时间】:2012-09-30 02:18:04
【问题描述】:

我无法理解 d3.call() 的工作原理以及何时何地使用它。 Here 是我正在尝试完成的教程链接。

有人可以具体解释一下这件作品在做什么

var xAxis = d3.svg.axis()
              .scale(xScale)
              .orient("bottom");

svg.append("g").call(xAxis);

【问题讨论】:

标签: javascript d3.js


【解决方案1】:

我认为这里的技巧是要理解 xAxis 是一个生成一堆 SVG 元素的函数。其实就是d3.svg.axis()返回的函数。 scale 和 orient 函数只是链接语法的一部分(在此处阅读更多内容:http://alignedleft.com/tutorials/d3/chaining-methods/)。

所以svg.append("g") 将一个 SVG 组元素附加到 svg 并以选择的形式返回对自身的引用(此处使用相同的链语法)。当您在选择上使用call 时,您正在对选择g 的元素调用名为xAxis 的函数。在这种情况下,您正在新创建和附加的组 g 上运行轴函数 xAxis

如果这仍然没有意义,上面的语法相当于:

xAxis(svg.append("g"));

或:

d3.svg.axis()
      .scale(xScale)
      .orient("bottom")(svg.append("g"));

【讨论】:

  • 如何编辑 svg.axis() 的 G 元素?我有相互渗透的标签,我想对它们应用转换。但我似乎无法访问这些元素
  • 在这里查看答案stackoverflow.com/questions/12825630/… 选择文本或刻度元素后,您应该可以根据需要应用转换。
  • 调用 xAxis 有什么不同吗?
  • 这很好地解释了.call() 方法。它没有特别解释调用轴对象的后果。而且它并不能证明轴对象表现得像对象和函数的超现实情况。为什么要这样做?好的,所以文档说叫它renders the axis。这比给轴对象一个 .render() 方法更好吗?那不是支持更直接的xAxis.scale(...).orient(...).render(...)
  • 来自选择调用中的文档:“唯一的区别是 selection.call 总是返回选择而不是被调用函数的返回值,名称。”
【解决方案2】:

IMO 所接受的答案是 .call()D3 API function,不要与 Function.prototype.call() 混淆

selection.call(function[, arguments…])

只调用一次指定的函数,将此选择与任何可选参数一起传递。返回此选择。这相当于手动调用函数,但有助于方法链接。例如,在一个可重用函数中设置多个样式:

现在说:

d3.selectAll("div").call(name, "John", "Snow");

这大致相当于:

name(d3.selectAll("div"), "John", "Snow");

其中 name 是一个函数,例如

function name(selection, first, last) {
  selection
      .attr("first-name", first)
      .attr("last-name", last);
}

唯一的区别是 selection.call 总是返回选择而不是被调用函数的返回值,name。

【讨论】:

  • 这确实非常重要的信息!!谢谢
猜你喜欢
  • 2012-06-14
  • 2016-09-07
  • 2016-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多