Я пытаюсь выполнить горячую замену типов диаграмм на основе изменений в поле выбора. Если данные необходимо обновить, они меняются.

Так, например, при загрузке страницы я создаю такую диаграмму:

var config = {
     type: 'line',
     data: {
        labels: this.labels,
        datasets: [{
            label: 'Some Label',
            data: this.values
        }]
     },
     options: {
         responsive: true
     }
}
var context = document.getElementById('canvas').getContext('2d');
window.mychart = new Chart(context, config);

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

Вот как я пытаюсь изменить график.

window.mychart.destroy();

// chartType = 'bar'
config.type = chartType;

var context = document.getElementById('canvas').getContext('2d');
window.mychart = new Chart(context, config);

window.mychart.update();
window.mychart.render();

Но ничего не происходит. График остается. Как я могу динамически изменять тип диаграммы? (Даже если это означает уничтожение и воссоздание холста диаграммы).

ОБНОВЛЕНИЕ

Обратите внимание: похоже, что он действительно разрушает диаграмму, но продолжает перерисовывать линейную диаграмму, хотя я делаю console.log(config.type);, и он возвращает bar, а не line

14
Nathan 30 Апр 2016 в 03:19

3 ответа

Лучший ответ

Исправление

  • Уничтожьте старую диаграмму (чтобы удалить прослушиватели событий и очистить холст)
  • Сделайте глубокую копию объекта конфигурации
  • Изменить тип копии
  • Передайте копию вместо исходного объекта.

Вот рабочий пример jsfiddle

Обзор примера:

var temp = jQuery.extend(true, {}, config);
temp.type = 'bar'; // The new chart type
myChart = new Chart(ctx, temp);

ПРИМЕЧАНИЕ. При использовании Chart.js версии 2.0.1.

Почему это работает

Chart.js изменяет переданный вами объект конфигурации. Из-за этого вы не можете просто изменить config.type. Вы можете войти в измененный объект и изменить все на нужный вам тип, но гораздо проще просто сохранить исходный объект конфигурации.

16
Community 20 Июн 2020 в 09:12

Альтернативное решение может быть таким же простым, как создание обеих диаграмм в отдельных элементах Div. Затем в соответствии с вашим условием просто сделайте один видимым и скройте другой в javascript. Это должно служить той цели, которая может быть у вас для изменения типа диаграммы в соответствии с вашими требованиями.

1
Aman Sharma 30 Апр 2016 в 02:24

Просто чтобы убедиться, что теперь это исправлено в версии 2.1.3, за чем следует https://stackoverflow.com/users/ 239375 / Натан

document.getElementById('changeToLine').onclick = function() {
  myChart.destroy();
  myChart = new Chart(ctx, {
    type: 'line',
    data: chartData
  });
};

Подтверждено исправлено в последней версии. Ознакомьтесь с http://codepen.io/anon/pen/ezJGPB и нажмите кнопку под диаграмму, чтобы изменить ее с гистограммы на линейную.

5
Community 23 Май 2017 в 12:24