Я использую Chartjs для отображения линейной диаграммы, и это отлично работает:
// get line chart canvas
var targetCanvas = document.getElementById('chartCanvas').getContext('2d');
// draw line chart
var chart = new Chart(targetCanvas).Line(chartData);
Но проблема возникает, когда я пытаюсь изменить данные для диаграммы. Я обновляю график, создавая новый экземпляр диаграммы с новыми точками данных и, таким образом, повторно инициализируя холст.
Это прекрасно работает. Однако при наведении указателя мыши на новую диаграмму, если мне случится пройти по определенным местам, соответствующим точкам, отображаемым на старой диаграмме, наведение / метка по-прежнему срабатывает, и внезапно становится видна старая диаграмма. Он остается видимым, пока моя мышь находится в этом месте, и исчезает при выходе из этой точки. Я не хочу, чтобы отображалась старая диаграмма. Я хочу удалить его полностью.
Я попытался очистить холст и существующую диаграмму перед загрузкой новой. Подобно:
targetCanvas.clearRect(0,0, targetCanvas.canvas.width, targetCanvas.canvas.height);
и
chart.clear();
Но пока ничего из этого не сработало. Есть идеи о том, как я могу остановить это?
источник
Ответы:
У меня были огромные проблемы с этим
Сначала я попробовал,
.clear()
потом попробовал,.destroy()
и попытался установить ссылку на диаграмму на nullЧто окончательно
<canvas>
устранило проблему для меня: удаление элемента и повторное добавление нового<canvas>
в родительский контейнерМой конкретный код (очевидно, есть миллион способов сделать это):
источник
$('#results-graph').remove(); $('#graph-container').append('<canvas id="results-graph"><canvas>');
доnew Chart(document.getElementById("myCanvas")
Несколько часов назад я столкнулся с той же проблемой.
Метод ".clear ()" фактически очищает холст, но (очевидно) оставляет объект живым и реактивным.
Внимательно читая официальную документацию , в разделе «Расширенное использование» я заметил метод «.destroy ()», описанный следующим образом:
Он действительно делает то, что заявляет, и у меня он отлично сработал, я предлагаю вам попробовать.
источник
источник
Это единственное, что у меня сработало:
источник
У меня была такая же проблема ... Я пытался использовать методы destroy () и clear (), но безуспешно.
Я решил это следующим образом:
HTML:
Javascript:
У меня это работает идеально ... Я надеюсь, что это поможет.
источник
Это очень хорошо сработало для меня
Используйте .destroy, чтобы уничтожить все созданные экземпляры диаграммы. Это очистит все ссылки, хранящиеся в объекте диаграммы в Chart.js, вместе со всеми связанными прослушивателями событий, прикрепленными Chart.js. Это необходимо вызвать перед повторным использованием холста для новой диаграммы.
источник
Мы можем обновить данные диаграммы в Chart.js V2.0 следующим образом:
источник
Используя CanvasJS, это работает для меня, очищая диаграмму, и все остальное, может работать и для вас, предоставляя вам полностью настраивать свой холст / диаграмму перед каждой обработкой в другом месте:
источник
Я не мог заставить работать .destroy (), так что я делаю это. Я хочу, чтобы холст отображался в div chart_parent. Мне нужно, чтобы размер холста менялся каждый раз, поэтому этот ответ является продолжением предыдущего.
HTML:
<div class="main_section" > <div id="chart_parent"></div> <div id="legend"></div> </div>
JQuery:
источник
Когда вы создаете один новый холст chart.js, это создает один новый скрытый iframe, вам нужно удалить холст и старые iframe.
ссылка: https://github.com/zebus3d/javascript/blob/master/chartJS_filtering_with_checkboxs.html
источник
Это сработало для меня. Добавьте вызов clearChart в верхней части updateChart ()
источник
Если вы используете chart.js в проекте Angular с Typescript, вы можете попробовать следующее:
источник
Что мы сделали, так это перед инициализацией новой диаграммы удалили / уничтожили экземпляр диаграммы предварительного просмотра, если он уже существует, затем создали новую диаграмму, например
Надеюсь это поможет.
источник
Дополняя ответ Адама
С Vanilla JS:
источник
Простое редактирование для 2020 года:
Это сработало для меня. Измените диаграмму на глобальную, сделав ее владельцем окна (измените декларацию с
var myChart
наwindow myChart
)Проверьте, инициализирована ли уже переменная диаграммы как Chart, если да, уничтожьте ее и создайте новую, даже если вы можете создать другую с тем же именем. Ниже приведен код:
Надеюсь, что это работает!
источник
Для меня это сработало:
источник
В Chart.js есть ошибка:
Chart.controller(instance)
любая новая диаграмма регистрируется в глобальном свойствеChart.instances[]
и удаляется из этого свойства.destroy()
.Но при создании диаграммы Chart.js также записывает
._meta
свойство в переменную набора данных:и это свойство не удаляется
destroy()
.Если вы используете свой старый объект набора данных, не удаляя его
._meta property
, Chart.js добавит новый набор данных в._meta
предыдущие данные. Таким образом, при каждой повторной инициализации диаграммы ваш объект набора данных накапливает все предыдущие данные.Чтобы этого избежать, уничтожьте объект набора данных после вызова
Chart.destroy()
.источник
Поскольку уничтожение уничтожает «все», дешевое и простое решение, когда все, что вам действительно нужно, это просто «сбросить данные». Сброс ваших наборов данных на пустой массив также будет работать нормально. Итак, если у вас есть набор данных с метками и осью с каждой стороны:
После этого вы можете просто позвонить:
или, в зависимости от того, используете ли вы 2-мерный набор данных:
Это будет намного легче, чем полностью уничтожить всю вашу диаграмму / набор данных и восстановить все.
источник
для тех, кто вроде меня использует функцию для создания нескольких графиков и хочет обновить их тоже блоком, у меня работала только функция .destroy (), я бы хотел создать .update (), который кажется более чистым, но ... . вот фрагмент кода, который может помочь.
источник
Сначала поместите диаграмму в какую-либо переменную, затем запишите ее в следующий раз перед запуском
# Проверяем, существует ли объект myChart, а затем искажаем его
источник