Angular D3了解attrTween函数

时间:2019-02-24 14:18:11

标签: javascript angular typescript d3.js

我试图了解如何在D3中使用attrTween函数。 我正在尝试通过以下示例实现一个饼图:http://bl.ocks.org/mbostock/5100636

但是,当我到达过渡部分时遇到了问题。

  private populateGauge(): void {
    const innerRadius = this.radius - 50;
    const outerRadius = this.radius - 10;
    const arc = d3
      .arc()
      .innerRadius(innerRadius)
      .outerRadius(outerRadius)
      .startAngle(0);

    const background = this.svg
      .append('path')
      .datum({ endAngle: this.tau })
      .style('fill', '#ddd')
      .attr('d', arc);
    this.myEndAngle = { endAngle: (this.gaugeData.value / 100) * this.tau };
    const foreground = this.svg
      .append('path')
      .datum(this.myEndAngle)
      .style('fill', 'orange')
      .attr('d', arc);

    foreground
      .transition()
      .duration(1500)
      .attrTween('d', function(newAngle) {
        return function(d) {
          const interpolate = d3.interpolate(d.endAngle, newAngle);
          return function(t) {
            d.endAngle = interpolate(t);
            return arc(d);
          };
        };
      });
    }

error

我一直试图使用简单的基本情况,并且仅在插值函数中使用0,但是我无法摆脱最后一个return语句引发的最终错误(return arc(d));

  

“数字”类型的参数不能分配给类型的参数   “ DefaultArcObject”。

如何解决这些问题? 让我知道是否需要提供更多信息。

1 个答案:

答案 0 :(得分:2)

var process = require("child_process") process.stdout.write(" Anything ") 采用单个函数,该函数返回另一个函数。您将其传递给一个函数,该函数以当前 datum index 和当前 node 作为参数被调用。该函数应返回插值函数,该插值函数将使用 time 值调用。

当我查看您的源代码时。您有3个嵌套函数,这是不正确的。

您需要将开始结束角度用作数据的值,并且不应该变异补间函数内部的 datum

我更喜欢在 tween 函数之外创建一个 arc 函数,然后将其用于我的插值。这样做会更有效,因为您不必每次都创建新的 arc 函数。

attrTween('d',...)

我发现使用节点包“ @ types / d3”更容易

const myArc = d3.arc();
// ^^^ call methods of arc() to configure settings that won't animate.

foreground
  .transition()
  .duration(1500)
  .attrTween('d', (d) => {
      return (t) => {
        const angle = d3.interpolate(d.endAngle, d.newAngle)(t);
        // ^^^ interpolate datum values using time.
        myArc.startAngle(angle);
        // ^^^ call methods of arc() to configure what you need.
        return myArc(null);
        // ^^^ call arc function to render "d" attribute.
      };
    };
  });

然后您可以将这些类型导入TypeScript文件

npm install @types/d3 --save-dev

如果您具有WebStorm之类的IDE。您可以在D3函数上按CTRL + CLICK,然后查看类型定义和注释。