Angular D3 понимает функцию attrTween

Я пытаюсь понять, как использовать функцию attrTween в D3. Я пытаюсь реализовать круговую диаграмму из следующего примера: 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);
          };
        };
      });
    }

Angular D3 понимает функцию attrTween

Я пытался использовать простые базовые случаи и просто использовать 0 в функции интерполяции, но я не могу избавиться от окончательной ошибки, которую выдает последний оператор возврата (return arc (d));

Argument of type 'number' is not assignable to parameter of type 'DefaultArcObject'.

Как мне обойти эти проблемы? Дайте мне знать, если вам нужна дополнительная информация.

Я предполагаю, что это работает нормально. Вы просто хотите отключить предупреждение TypeScript? Правильное определение типов с помощью D3 и TypeScript может быть проблемой.

Reactgular 24.02.2019 15:36
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
4
1
1 889
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

attrTween('d',...) принимает одну функцию, которая возвращает другую функцию. Вы передаете ему функцию, которая вызывается с текущими датум, показатель и текущими узел в качестве параметров. Эта функция должна возвращать функцию интерполяции, которая вызывается со значением время.

Когда я смотрю на ваш исходный код. У вас есть 3 вложенные функции, и это неправильно.

Вам необходимо иметь углы Начало и конец в качестве значений датум, и не следует использовать мутировать для датум внутри функции твина.

Я предпочитаю создавать функцию дуга вне функции подросток, а затем использовать ее для интерполяции. Что более эффективно, поскольку вы не создаете новую функцию дуга каждый раз.

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.
      };
    };
  });

Мне проще использовать пакет узлов "@types/d3"

npm install @types/d3 --save-dev

Затем вы можете импортировать эти типы в файл TypeScript.

import * as d3 from 'd3';

Если у вас есть IDE, такая как WebStorm. Вы можете нажать CTRL+CLICK на функции D3 и просмотреть определения типов и комментарии.

И в VS Code (который, похоже, использует OP) вы можете увидеть определения типов, нажав F12 - Перейти к определению

Patrick 24.02.2019 17:29

Спасибо за ваш ответ. Запускается, но боюсь не с анимационным эффектом.. Целый день просидел с этой функцией. Вот как я изменил его после вашего сообщения: i.gyazo.com/9dc8dd33013dcbc6df71be327d10c195.png Это не вызывает никаких реальных ошибок времени выполнения, но также не показывает переход.

maac 24.02.2019 17:44

Другие вопросы по теме