作者:美猴qing_243 | 来源:互联网 | 2023-01-26 14:16
在尝试初始化使用带有API获取数据的ngx-charts构建的图表时,我遇到了一些不愉快的时期.
我建立了一个休息api,通过正确的调用,吐出一些时间序列数据.
{
"prices": [
{
"item": "1",
"price": 2,
"estimated": 2.1,
"date": [
2012,
8,
16
]
},
{
"item": "1",
"price": 3,
"estimated": 4.1,
"date": [
2012,
9,
16
]
},
{
"item": "1",
"price": 5,
"estimated": 7.1,
"date": [
2012,
10,
16
]
}
]
}
我建立了price.model.ts来正确处理它,它工作得很好
export class PriceModel {
public id: string;
public price: number;
public estimated: number;
public date: number[];
constructor(
id: string,
price: number,
estimated: number,
date: number[]
) {
this.id = id;
this.price = price;
this.estimated = estimated;
this.date = date;
}
}
然后,我设置了我的details.component.ts以执行这样的api调用,获取数据,解析它并将其呈现到图表中.
import { Component } from '@angular/core';
import { NgxChartsModule } from '@swimlane/ngx-charts';
import { Http } from '@angular/http';
/** App Models **/
import { PriceModel } from '../../shared/components/prices/price.model';
import { ChartDataModel } from '../../shared/components/prices/chart-data.model';
@Component({
selector: 'app-details',
templateUrl: './details.page.html',
providers: [NgxChartsModule]
})
export class DetailsPage {
private sub: any;
private prices: PriceModel[];
ngxData: ChartDataModel = {
data: [
{
name: 'prices',
series: []
},
{
name: 'forecast',
series: []
}
]
};
view: any[] = [1000, 750];
// options
showXAxis = true;
showYAxis = true;
gradient = false;
showLegend = true;
showXAxisLabel = true;
xAxisLabel = 'Dates';
showYAxisLabel = true;
yAxisLabel = 'Prices';
colorScheme = {
domain: ['#5AA454', '#A10A28', '#C7B42C', '#AAAAAA']
};
// line, area
autoScale = true;
constructor(private _http: Http) {
console.log(this.ngxData.data);
Object.assign(this.ngxData);
}
ngOnInit() {
this.sub = this._http.get('someroute').subscribe((prices) => {
this.prices = prices.json().prices;
let currData;
this.prices.map((p) => {
currData = new Date(p.date[0], p.date[1], p.date[2]);
this.ngxData.data[0].series.push({ name: currData.getTime().toString(), value: p.price });
this.ngxData.data[1].series.push({ name: currData.getTime().toString(), value: p.estimated });
});
}, (err) => {
console.log(err);
});
}
ngOnDestroy() {
this.sub.unsubscribe();
}
}
我的ChartDataModel.ts定义为
export class ChartDataModel {
public data: SerieModel[];
constructor(data: SerieModel[]) {
this.data = data;
}
}
export class SerieModel {
public name: string;
public series: SeriersChildModel[];
constructor(name: string, series: SeriersChildModel[]) {
this.name = name;
this.series = series;
}
}
export class SeriersChildModel {
public name: string;
public value: number;
constructor(name: string, value: number) {
this.name = name;
this.value = value;
}
}
最后,这是我的details.page.html
记录this.ngxData.data
之前记录Object.assign
一切都很好
但我最终得到了以下结果
我按照此处提供的示例进行操作,但最终没有实际显示的数据.
我不明白为什么,即使数据格式化为库所需,数据也不会显示.
我究竟做错了什么?它是由构造函数中的错误初始化引起的吗?
1> Fetrarij..:
您的问题是关于修改系列,ngxData.data[x]series.push()
而不是通过更改检测来识别.
ngxData.data
应检测到重新分配:this.ngxData.data = [...this.ngxData.data]
ngOnInit() {
this.sub = this._http.get('someroute').subscribe((prices) => {
this.prices = prices.json().prices;
let currData;
this.prices.map((p) => {
currData = new Date(p.date[0], p.date[1], p.date[2]);
this.ngxData.data[0].series.push({ name: currData.getTime().toString(), value: p.price });
this.ngxData.data[1].series.push({ name: currData.getTime().toString(), value: p.estimated })
});
//your solution
this.ngxData.data = [...this.ngxData.data];
}, (err) => {
console.log(err);
});
}
我设法添加了一个plunker https://plnkr.co/edit/JSTcS4FnJ5dshAldLWPL?p=preview