[英]chartjs angular update order
有一个关于 angular11 环境中的 chartjs 的问题。 我有 2 个图表
appcomponent.html:
<div class="col-sm">
<canvas id="bl" ></canvas>
</div>
<div class="col-sm">
<canvas id="bl2" ></canvas>
</div>
app.component.ts:
export class AppComponent {
testChart: any;
testChart2: any;
...
constructor(private dataSvc:DataRetrieverService){
dataSvc.getUsers.subscribe( data=> {
if(!data) return;
this.Users = data;
this.Users.forEach(x => {
this.UsersLabels.push(x.StoreDateTime);
this.UsersAmount.push(x.Amount);
this.CreateCharts();
})
})
dataSvc.getParts.subscribe( data=> {
if(!data) return;
this.Parts = data;
this.Parts.forEach(x => {
this.PartsLabels.push(x.StoreDateTime);
this.PartsAmount.push(x.Amount);
this.CreateCharts();
})
})
}
CreateCharts(){
if(this.testChart){
this.testChart.destroy()
}
if(this.testChart2){
this.testChart2.destroy()
}
this.testChart = new Chart('bl', {
type: 'line',
data: {
labels: this.UsersLabels,
datasets: [
{
label: 'Users',
data: this.UsersAmount,
borderColor: '#01c38c',
backgroundColor: '#01c38c',
fill: false
}
]
},
options: {... }
}
});
this.testChart2 = new Chart('bl2', {
type: 'line',
data: {
labels: this.PartsLabels,
datasets: [
{
label: 'Parts',
data: this.PartsAmount,
borderColor: '#01c38c',
backgroundColor: '#01c38c',
fill: true
}
]
},
options: {...
}
});
正在创建testChart: 任何正确的事情吗?
为什么我必须在每次从服务中检索数据后调用this.CreateCharts()才能使其正常工作?
我希望如果我在构造函数的最后一步执行this.CreateCharts()它也可以工作,但是我的图表是空的。
您订阅了从dataSvc.getUsers
和dataSvc.getParts
获得的两个Observable
,相应的结果将异步传递,当然是在constructor
调用完成之后。 因此,如果使用给定代码,仅在constructor
末尾调用CreateChart()
,您将看到两个空图表,因为UsersLabels
、 UsersAmount
、 PartsLabels
和PartsAmount
仍然为空 arrays。
然而,每次任何Observable
交付新数据时都无需重新创建这两个图表。 您最好将CreateChart()
拆分为单独的方法,每个图表一个。 此外,您最好不要使用chart.destroy()
,而是最好简单地更新现有图表data
并在之后调用chart.update()
。 请查看 Chart.js 文档的添加或删除数据部分。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.