代码之家  ›  专栏  ›  技术社区  ›  four-eyes

转换在第一次创建图表时不起作用

  •  -1
  • four-eyes  · 技术社区  · 6 年前

    我创造了一个 D3 像这样的图表

    http://jsfiddle.net/gs6rehnx/2042/

    <button type="button" onclick="createPie()">Click Me First!</button>
    <button type="button" onclick="updatePie()">Update Diagram!</button>
    <div class='foo'></div>
    
    
    const width = 260;
    const height = 260;
    const thickness = 40;
    const duration = 750;
    
    const radius = Math.min(width, height) / 2;
    const color = d3.scaleOrdinal(d3.schemeCategory10);
    
    const arc = d3
      .arc()
      .innerRadius(radius - thickness)
      .outerRadius(radius);
    
    const pie = d3
      .pie()
      .value(function(d) {
        return d.value;
      })
      .sort(null);
    
    
    const create = function(data) {
      const svg = d3
        .select('.foo')
        .append('svg')
        .attr('class', 'pie')
        .attr('width', width)
        .attr('height', height);
    
      svg
        .append('g')
        .attr('transform', 'translate(' + width / 2 + ',' + height / 2 + ')')
        .attr('id', 'bar');
    
      draw(data);
    }
    
    const draw = function(data) {
      const path = d3.select('#bar')
        .selectAll('path')
        .data(pie(data))
    
      path
        .enter()
        .append('g')
        .append('path')
        .attr('d', arc)
        .attr('fill', (d, i) => color(i));
    
      path
        .transition()
        .duration(duration)
        .attrTween('d', function(d) {
          const interpolate = d3.interpolate({
            startAngle: 0,
            endAngle: 0
          }, d);
          return function(t) {
            return arc(interpolate(t));
          };
        });
    };
    
    
    const data = [{
        name: 'USA',
        value: 50
      },
      {
        name: 'UK',
        value: 5
      },
      {
        name: 'Canada',
        value: 5
      },
      {
        name: 'Maxico',
        value: 40
      }
    ]
    
    function createPie() {
      create(data)
    }
    
    const newData = [{
        name: 'USA',
        value: 40
      },
      {
        name: 'UK',
        value: 20
      },
      {
        name: 'Canada',
        value: 30
      },
      {
        name: 'Maxico',
        value: 10
      }
    ];
    
    function updatePie() {
      draw(newData)
    }
    

    单击 Click Me First! Update Diagram! 按钮,转换工作。为什么单击第一个按钮就不起作用?

    1 回复  |  直到 6 年前
        1
  •  0
  •   SH K    6 年前

    很简单, 当您单击 Click Me First create 函数和调用 draw

    但是 Update Diagram! 单击第一个按钮,svg不存在。 so函数

     const path = d3.select('#bar')
                   .selectAll('path')
                    .data(pie(data))