更新 chartjs 和 angular 中的图表
Update charts in chartjs and angular
我在 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()。但是我仍然遇到关于图表未定义等的错误
上面的组件装饰器有这个:-
var require: any;
var Chart = require('chart.js');
在组件中有一个 属性 用于保存图表实例
public chart: Chart;
首先你需要了解的是Chart.plugins.register只会为所有图表全局注册一个插件。
https://www.chartjs.org/docs/latest/developers/plugins.html#global-plugins
您需要一个图表才能应用此插件
假设您的 HTML 中有一个 Canvas,例如:-
<div>
<canvas id="canvas">{{ chart }}</canvas>
</div>
您需要将您的内部 ngoninit 更新为 ngrx 订阅以创建一个新图表(如果它不可用)。
ngOnInit() {
this._registerCustomChartJSPlugin();
this.yrSubscription = this.userDataStore.pipe(select(selectYrReport))
.subscribe(el => {
if(!this.chart) {
this.createChart();
}
el.sessions.forEach(item => {
this.datasetsSessions[0].data.push(+item);
});
this.chart.update();
});
}
public createChart() {
this.chart = new Chart('canvas'); //Include if any object required as second Parameter
}
假设您在同一个组件中注册图表。首先,您需要保留对自定义图表的引用。在您的组件中将此添加到您的组件 class
customChartInstance : Chart;
然后在你的 afterDatasetsDraw
添加
this.customChartInstance=chart
然后在您的订阅中添加
this.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。
我在 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()。但是我仍然遇到关于图表未定义等的错误
上面的组件装饰器有这个:-
var require: any;
var Chart = require('chart.js');
在组件中有一个 属性 用于保存图表实例
public chart: Chart;
首先你需要了解的是Chart.plugins.register只会为所有图表全局注册一个插件。 https://www.chartjs.org/docs/latest/developers/plugins.html#global-plugins
您需要一个图表才能应用此插件
假设您的 HTML 中有一个 Canvas,例如:-
<div>
<canvas id="canvas">{{ chart }}</canvas>
</div>
您需要将您的内部 ngoninit 更新为 ngrx 订阅以创建一个新图表(如果它不可用)。
ngOnInit() {
this._registerCustomChartJSPlugin();
this.yrSubscription = this.userDataStore.pipe(select(selectYrReport))
.subscribe(el => {
if(!this.chart) {
this.createChart();
}
el.sessions.forEach(item => {
this.datasetsSessions[0].data.push(+item);
});
this.chart.update();
});
}
public createChart() {
this.chart = new Chart('canvas'); //Include if any object required as second Parameter
}
假设您在同一个组件中注册图表。首先,您需要保留对自定义图表的引用。在您的组件中将此添加到您的组件 class
customChartInstance : Chart;
然后在你的 afterDatasetsDraw
添加
this.customChartInstance=chart
然后在您的订阅中添加
this.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。