Я пытаюсь извлечь больше данных в мою линейную диаграмму chartjs (или использовать некоторые кэшированные резервные данные) onZoom / onPan, но у меня много проблем с этим.
Моя исходная кодовая база очень сложна, и я не могу скопировать ее здесь полностью, но я поделюсь тем, что уже пробовал.
1-е решение: Chartjs-plugin-zoom
разделяет onZoom
и onPan
обратные вызовы, как упомянуто здесь
но они не предоставляют никакого контекста (chart, x, y) с этими обратными вызовами и вызовами при панорамировании / масштабировании, и это даже неправильно.
Этот PR решает несколько проблем, но еще не объединен: Ссылка
2-е решение: Я пытаюсь получить данные изменений в диаграмме js в beforeUpdate
обратном вызове, но это также вызывает много проблем.
По умолчанию я показываю около 1000 точек данных на графике, и, поскольку мой график обновляется каждую секунду, я пытаюсь создать резервную копию данных, которые будут содержать переданные точки данных за пределами 1000 точек данных, поэтому, когда кто-то увеличивает масштаб, я проверяю координаты влево и вправо, и если они изменяются (увеличение), я хочу увеличить данные в наборе данных в beforeUpdate
обратный вызов.
scales: {
xAxes: [{
id: 'x-axis-0',
type: 'time',
beforeUpdate: function (chart) {
const scale = chart.chart.scales['x-axis-0']
if (scale.margins) {
const left = scale.getValueForPixel(scale.left)
const right = scale.getValueForPixel(scale.right)
const diffSec = (right - left) / 1000;
if (diffSec < 240) {
chart.chart.options.scales.xAxes[0].time.unit = 'second'
} else if (diffSec < 4*3600) {
chart.chart.options.scales.xAxes[0].time.unit = 'minute'
} else {
chart.chart.options.scales.xAxes[0].time.unit = 'minute'
chart.chart.options.scales.xAxes[0].time.stepSize = 10
}
}
// Ignore this if condition it is just for testing/debugging
if (chart.chart.data.labels.length > 1) {
// there are three line in graph
chart.chart.data.datasets[0].data = getMinArray(diffSec)
chart.chart.data.datasets[1].data = getAvgArray(diffSec)
chart.chart.data.datasets[2].data = getMaxArray(diffSec)
chart.chart.data.labels = getLabels(diffSec)
chart.update()
}
}
}
Во втором методе я получаю больше ошибок, таких как:
TypeError: Невозможно прочитать свойство 'hidden' неопределенного
У вас есть 3-е решение? , пожалуйста, киньте его ниже.
РЕДАКТИРОВАТЬ: Я пробовал с разными версиями
"chart.js": "2.8.0",
"chartjs-plugin-zoom": "^0.7.0",
Кажется, что 1-е решение сейчас работает, но есть другая проблема:
onZoom
вызывается при увеличении, а не
Function called once zooming is completed
как упоминалось в Readme , так что это не очень поможет при извлечении данных из API.