gpt4 book ai didi

javascript - 更新 chartjs 和 angular 中的图表

转载 作者:行者123 更新时间:2023-12-01 15:29:15 26 4
gpt4 key购买 nike

我有 Angular 更新图表 js 的问题。我正在使用 ngrx 商店。

在选择器订阅者(在 ngOnInit 中运行)中,我尝试更新图表数据:

this.yrSubscription = this.userDataStore.pipe(select(selectYrReport))
.subscribe(el => {
el.sessions.forEach(item => {
this.datasetsSessions[0].data.push(+item);
});
});

还有我的图表数据:
datasetsSessions: ChartDataSets[] = [{
label: 'Sessions',
data: [],
fill: false
}];

注册图表:
private _registerCustomChartJSPlugin(): void {
(window as any).Chart.plugins.register({
afterDatasetsDraw: (chart, easing): any => {
if (!chart.options.plugins.xLabelsOnTop
|| (chart.options.plugins.xLabelsOnTop && chart.options.plugins.xLabelsOnTop.active === false)) {
return;
}

const ctx = chart.ctx;

chart.data.datasets.forEach((dataset, i): any => {
const meta = chart.getDatasetMeta(i);
if (!meta.hidden) {
meta.data.forEach((element, index): any => {
// Draw the text in black, with the specified font
ctx.fillStyle = 'rgba(255, 255, 255, 0.7)';
const fontSize = 13;
const fontStyle = 'normal';
const fontFamily = 'Roboto, Helvetica Neue, Arial';
ctx.font = (window as any).Chart.helpers.fontString(fontSize, fontStyle, fontFamily);

const dataString = dataset.data[index].toString() + 'k';

ctx.textAlign = 'center';
ctx.textBaseline = 'middle';
const padding = 15;
const startY = 24;
const position = element.tooltipPosition();
ctx.fillText(dataString, position.x, startY);

ctx.save();

ctx.beginPath();
ctx.setLineDash([5, 3]);
ctx.moveTo(position.x, startY + padding);
ctx.lineTo(position.x, position.y - padding);
ctx.strokeStyle = 'rgba(255,255,255,0.12)';
ctx.stroke();

ctx.restore();
});
}
});
}
});
}

我在构造函数中调用它。

我知道,我需要运行 chart.update()。但我仍然有关于图表未定义等的错误。

最佳答案

使用时ng2-charts ,无需调用 chart.update() ,让 Angular 变化检测来完成它的工作。如果它没有按预期工作,请重新分配 data向其推送新值后的数组。这可以使用 Array.slice() 来完成如下所示。

this.yrSubscription = this.userDataStore.pipe(select(selectYrReport))
.subscribe(el => {
el.sessions.forEach(item => {
this.datasetsSessions[0].data.push(+item);
this.datasetsSessions[0].data = this.datasetsSessions[0].data.slice();
});
});

但主要问题可能位于 _registerCustomChartJSPlugin方法。与其定义这样的方法,不如在 chartPlugins 中定义其内容。变量如下:
chartPlugins = [{
afterDatasetsDraw: (chart, easing): any => {
...
}
}];

在 HTML 模板中,您必须提供 chartPlugins如下。
<canvas baseChart
[datasets]="datasetsSessions"
[plugins]="chartPlugins"
...
</canvas>

请看看这个 StackBlitz .

关于javascript - 更新 chartjs 和 angular 中的图表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62104695/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com