Почему «d» не определено в attrTween? - PullRequest
1 голос
/ 06 января 2020

Я пытаюсь создать интерфейс на d3. Я нашел код анимации ar c (http://bl.ocks.org/mbostock/5100636) и хочу немного его изменить (без функции arcTween ()). Вот часть моего кода:

            var arc3 = d3.arc().innerRadius(77).outerRadius(90).startAngle(0);
            var foregroundArc3 = imgs3
              .append('path')
              .attr('d', arc3)
              .attr('stroke', 'white')
              .attr('fill', 'white')
              .style('fill-opacity', 0.5)
              .attr('transform', 'translate('+(146.5)+','+(150.9)+')')
              .datum({endAngle: 0.0628*90, newAngle: 0.0628*270})
              .transition()
              .duration(1500)
              .attrTween('d',  (d) => {
                return (t) => {
                  const interpolate = d3.interpolate(d.endAngle, d.newAngle);
                    d.endAngle = interpolate(t);
                    return arc3(d);
                  };
          });

Но есть ошибка: Аргумент типа '{endAngle: number; newAng: номер; } 'нельзя назначить параметру типа' DefaultArcObject '. Свойство innerRadius отсутствует в типе {endAngle: number; newAng: номер; }».

И в консоли браузера "d" не определено. Я пытался найти какие-либо другие рабочие решения, но безрезультатно.

1 Ответ

1 голос
/ 07 января 2020

Когда вы делаете это ...

.attr('d', arc3)

... второй аргумент attr, который является функцией arc3, получает переданный связанный элемент, индекс и группу узла ,

Однако нет привязанной привязки, поскольку в вашем коде метод datum приходит после .

Самое простое решение - просто переместить datum в перед строкой .attr('d', arc3):

var svg = d3.select("svg");
var arc3 = d3.arc().innerRadius(77).outerRadius(90).startAngle(0);
var foregroundArc3 = svg
  .append('path')
  .datum({
    endAngle: 0.0628 * 90,
    newAngle: 0.0628 * 270
  })
  .attr('d', arc3)
  .attr('fill', 'teal')
  .style('fill-opacity', 0.5)
  .attr('transform', 'translate(' + (146.5) + ',' + (150.9) + ')')
  .transition()
  .duration(1500)
  .attrTween('d', (d) => {
    return (t) => {
      const interpolate = d3.interpolate(d.endAngle, d.newAngle);
      d.endAngle = interpolate(t);
      return arc3(d);
    };
  });
<svg></svg>
<script src="https://d3js.org/d3.v5.min.js"></script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...