如何在 ChartJS 中包含适配器和插件
Posted
技术标签:
【中文标题】如何在 ChartJS 中包含适配器和插件【英文标题】:How to include adapters and plugins with ChartJS 【发布时间】:2021-10-07 01:14:43 【问题描述】:将 Chart.js 与时间序列数据(需要像 moment.js 这样的适配器)和仅使用 CDN 的缩放/平移功能 (chartjs-plugin-zoom) 一起使用的最新 (ES6) 和最小方式是什么?一定要使用require还是import?
下面的代码将抛出与来自其他适配器和插件的缺失函数相关的错误。
var default_series = [1, 2, 3, 4, 5];
var default_time_series = [new Date()];
for (let i = 1; i < 5; i++)
var tempDay = new Date(default_time_series[i - 1]);
tempDay.setDate(tempDay.getDate() + 1);
default_time_series.push(new Date(tempDay.valueOf()));
const default_chart_dataset =
data: [],
label: 'Default',
borderColor: '#000000',
fill: false,
hidden: false,
spanGaps: false,
pointRadius: 0
;
var chart_data =
type: 'line',
data:
labels: [],
datasets: []
,
options:
title:
display: true,
text: "A Chart"
,
scales:
x:
type: "time",
time:
// unit: 'day',
// tooltipFormat: 'MMM DD',
displayFormats:
day: 'MMM DD YY'
,
plugins:
zoom:
pan:
enabled: true,
mode: 'x'
,
zoom:
wheel:
enabled: true
,
pinch:
enabled: true
,
mode: 'x'
;
var main_chart = new Chart(document.getElementById('a-chart').getContext('2d'), chart_data);
main_chart.data.datasets.push(...default_chart_dataset);
main_chart.data.datasets[0].data = [...default_series];
main_chart.data.labels = [...default_time_series];
main_chart.update();
<html lang="en">
<body>
<canvas id="a-chart" class="a-graph" ></canvas>
<script src="https://cdn.jsdelivr.net/npm/chart.js@3.5.0/dist/chart.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/moment@2.29.1/moment.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/hammerjs@2.0.8/hammer.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/chartjs-plugin-zoom@1.1.1/dist/chartjs-plugin-zoom.min.js"></script>
</body>
</html>
【问题讨论】:
【参考方案1】:如 documentation 和 migration guide 中所述,自 chart.js 版本 3 起,您将需要自己包含一个日期适配器。
示例:
var default_series = [1, 2, 3, 4, 5];
var default_time_series = [new Date()];
for (let i = 1; i < 5; i++)
var tempDay = new Date(default_time_series[i - 1]);
tempDay.setDate(tempDay.getDate() + 1);
default_time_series.push(new Date(tempDay.valueOf()));
const default_chart_dataset =
data: [],
label: 'Default',
borderColor: '#000000',
fill: false,
hidden: false,
spanGaps: false,
pointRadius: 0
;
var chart_data =
type: 'line',
data:
labels: [],
datasets: []
,
options:
title:
display: true,
text: "A Chart"
,
scales:
x:
type: "time",
time:
// unit: 'day',
// tooltipFormat: 'MMM DD',
displayFormats:
day: 'MMM DD YY'
,
plugins:
zoom:
pan:
enabled: true,
mode: 'x'
,
zoom:
wheel:
enabled: true
,
pinch:
enabled: true
,
mode: 'x'
;
var main_chart = new Chart(document.getElementById('a-chart').getContext('2d'), chart_data);
main_chart.data.datasets.push( ...default_chart_dataset
);
main_chart.data.datasets[0].data = [...default_series];
main_chart.data.labels = [...default_time_series];
main_chart.update();
<html lang="en">
<body>
<canvas id="a-chart" class="a-graph" ></canvas>
<script src="https://cdn.jsdelivr.net/npm/chart.js@3.5.0/dist/chart.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/moment@2.29.1/moment.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/hammerjs@2.0.8/hammer.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/chartjs-plugin-zoom@1.1.1/dist/chartjs-plugin-zoom.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/chartjs-adapter-moment/1.0.0/chartjs-adapter-moment.js"></script>
</body>
</html>
【讨论】:
太棒了!没有意识到这是单独包含的 moment.js 模块加上单独包含的模块的适配器以上是关于如何在 ChartJS 中包含适配器和插件的主要内容,如果未能解决你的问题,请参考以下文章
当 listview 行项目中包含隐藏视图时,片段不尊重匹配父高度