【问题标题】:Map JSON for Chartjs with Angular 7使用 Angular 7 为 Chartjs 映射 JSON
【发布时间】:2018-12-03 16:05:36
【问题描述】:

我正在尝试映射 JSON 数据以在条形图中显示它。我需要的最终数组必须如下所示:[883, 5925, 17119, 27114, 2758]。 实际上,我想用来设置 barChartData (dringlichkeitenValues[]) 的数组似乎是空的。对不起我糟糕的编码技巧。谁能告诉我如何解决这个问题?

JSON:

[{
    "id": 1,
    "value": 883
},
{
    "id": 2,
    "value": 5925
},
{
    "id": 3,
    "value": 17119
},
{
    "id": 4,
    "value": 27144
},
{
    "id": 5,
    "value": 2758
}]

api.service.ts

getDringlichkeiten(): Observable<IDringlichkeit[]> {
    return this.http.get<IDringlichkeit[]>(this.ROOT_URL + '/aufenthalte/dringlichkeit');}

dringlichkeit.ts

  export interface IDringlichkeit {
  id: number;
  value: number;
}

条形图.component.ts

   export class BarChartComponent implements OnInit {

  public dringlichkeitValues:number[] = [];
  public dringlichkeiten: IDringlichkeit[];
  public barChartLabels:String[] = ["1", "2", "3", "4", "5"];
  public barChartData:number[] = this.dringlichkeitValues;
  public barChartType:string = 'bar';

  constructor(private aufenthaltService: AufenthaltService) {

  }

  ngOnInit() {
    this.loadData();
    this.getDringlichkeitValues();
  }

  loadData(){

    this.aufenthaltService.getDringlichkeiten()
    .subscribe( data => this.dringlichkeiten = data);
  }

  getDringlichkeitValues(){
    let dringlichkeitValues:number[]=[];
    this.dringlichkeiten.forEach(dringlichkeit=>{
      dringlichkeitValues.push(dringlichkeit.value)
      this.dringlichkeitValues = dringlichkeitValues;
    });
    return this.dringlichkeitValues;
  }

}

更新: 我更新了我的组件,但现在我的数组在订阅 Observable 后仍然是空的。

条形图.component.ts

chart: Chart;
  dringlichkeiten: IDringlichkeit[] = [];


  constructor(private aufenthaltService: AufenthaltService) {
  }

  ngOnInit() {

    this.aufenthaltService.getDringlichkeiten()
    .subscribe( data => {
      this.dringlichkeiten = data;

      //dringlichkeiten-Array full
      console.log(this.dringlichkeiten);
    });

    //dringlichkeiten-Array empty
    console.log(this.dringlichkeiten);


    this.chart = new Chart('canvas', {
      type: 'bar',
      data: {
        labels: this.dringlichkeiten.map(x => x.id),
        datasets: [
          {
            label: 'Dringlichkeiten',
            data: this.dringlichkeiten.map(x => x.value),
            backgroundColor: ['#FF6384', '#4BC0C0', '#FFCE56', '#E7E9ED', '#36A2EB']
          }
        ]
      },
    });


  }

【问题讨论】:

    标签: json angular chart.js bar-chart angular7


    【解决方案1】:

    要从 JSON 数组中获取“值”,您可以使用:

    dringlichkeiten.map(x => x.value)
    

    这将为您提供所需的数组,即:

    [883, 5925, 17119, 27114, 2758]
    

    然后,您可以将此数组传递给 chartJS,以便它为您呈现如下图表:

    this.chart = new Chart('canvas', {
      type: 'bar',
      data: {
        labels: dringlichkeiten.map(x => x.id),
        datasets: [
          {
            label: 'My Bar Chart',
            data: dringlichkeiten.map(x => x.value),
            backgroundColor: ['red', 'green', 'yellow', 'blue', 'orange']
          }
        ]
      },
    });
    

    看看this 简化的工作 SlackBlitz 示例。

    希望这会有所帮助!

    【讨论】:

    • 非常感谢!像 U 一样在同一个组件中定义数组是可行的。但是,如果我想在 ngOnInit{} 中使用 loadData() 订阅我的 Observable,那么数组似乎仍然是空的......当我在订阅数据时 console.log(this.dringlichkeiten) 就像我需要它一样。你知道为什么局部变量 dringlichkeiten 没有变化吗?
    • 我不太明白你的意思。看看你的ngOnInit 方法,我建议删除getDringlichkeitValues() 方法,因为我认为不需要它。是这种方法导致您的问题吗?
    • 您的方法getDringlichkeitValues() 将在您的loadData() 方法解决之前运行,因为这两种方法都在运行synchronously,因此,this.dringlichkeitengetDringlichkeitValues() 方法中将始终为空。
    • 我删除了这个方法。你能检查一下我上面更新的课程吗?我放置了 2 个 console.logs - 第一个有值,第二个没有。但为什么呢?
    • 第二个console.log 是空的,因为它在组件加载后立即执行,而另一个在您的 api 调用返回数据后执行。您基本上需要在您的 api 调用完成后创建图表,即一旦您拥有数据。看看this SlackBlitz 示例,它模仿了一个 api 调用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-08
    • 2020-02-05
    • 2019-07-27
    • 1970-01-01
    • 2018-10-17
    • 2018-10-13
    相关资源
    最近更新 更多