High Charts не может динамически добавлять серии - PullRequest
0 голосов
/ 05 октября 2018

Я впервые использую HighCharts, и мне трудно найти источники, которые помогут мне решить эту проблему.

Я пытаюсь отобразить несколько графиков с разными номерами серий.Вместо того, чтобы настраивать несколько шаблонов параметров, я хочу использовать только один и использовать функцию для настройки объекта параметров каждый раз.Здесь я предоставил фиктивные данные о том, как будет выглядеть одна из диаграмм, полученная из API.В приложении я планирую кормить его из HTML.

Я продолжаю сталкиваться с различными проблемами из-за моего непонимания HighCharts, сейчас я просто хожу по кругу, исправляя одну проблему только для того, чтобы всплыла проблема прошлого, я надеялся, что кто-то может указать мнев правильном направлении.Это мой класс:

export class CompletenessTabComponent implements OnInit, AfterViewInit {
  @ViewChild('chartTarget') chartTarget: ElementRef;

  chart: Highcharts.ChartObject;

  dataObj = {"id":0,
    "tableName":"d1 vs d2",
    "data":{"d1Count":[50,45,55,60,70],
      "d2Count":[40,32,55,58,33],
      "Errors":[2,3,4,1,0]},
    "dates":[20180927,20180928,20181001,20181002,20181003]
  };

  constructor() { }

  setHighChartOptions(data, seriesNames, chartTitle ): any {
    count = 1;
    highChartOptions.title.text = chartTitle;
    highChartOptions.xAxis.data = data.dates;
    this.chart.series[0].setData(this.dataObj.data[0]);
    Object.keys(data.data).forEach((key) =>
      this.chart.addSeries({
        name: seriesNames[count],
        data: data.data[key],
        type: 'line'
      }) count ++
    );
    return highChartOptions;
  }
  getHighChartOptions(){
    return highChartOptions;
  }
  ngOnInit() {
    this.chart = chart(this.chartTarget.nativeElement, this.setHighChartOptions(this.dataObj, ['d1', 'd2', 'error'], this.dataObj.tableName));
    Object.keys(this.dataObj.data).forEach(key =>
    console.log(key, this.dataObj.data[key]))
  }
  ngAfterViewInit() {
  }

}

const highChartOptions = {
  colors:
    ['#058DC7', '#50B432', '#ED561B', '#DDDF00', '#24CBE5', '#64E572', '#FF9655', '#FFF263', '#6AF9C4'],

  credits: {
    enabled: false
  },
  chart: {
    backgroundColor: null,
  },
  legend: {
    layout: 'vertical',
    align: 'right',
    verticalAlign: 'top',
    itemStyle: {
      fontSize: '10px',
      fontWeight: 'normal'
    }
  },
  tooltip: {
    valuePrefix: '$'
  },
  title: {
    text: ''
  },
  xAxis: {
    type: 'date',
    data: [],
    title: 'date'
  },
  yAxis: {
    title: {
      align: 'middle',
      rotation: 0,
      text: ''
    }
  },
  plotOptions: {
    series: {
      marker: {
        enabled: false
      },
      shadow: false
    }
  },
  series: [{
    type: 'line',
    name: '',
    data: [null]
  }]
};

Я получаю несколько ошибок:

в setHighChartOptions (): невозможно прочитать свойство 'series' из undefined (at, this.chart.series [0]), & не может прочитать «ключи» из неопределенного (в начале цикла ForEach).

Я полагаю, что большая проблема в том, что объект диаграммы не определен, что не имеет смысла, так как я создал его в верхней части класса, а затем при помощи InInit устанавливаю параметры диаграммы.

Надеюсь, вы сможете обнаружить мои ошибки и помочь мне.Спасибо.

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

Скорее всего, это потому, что вы пытаетесь обратиться к серии, которая еще не определена.На самом деле, если вы вызываете setHighchartsOptions в первый раз, ваш график еще не определен.

Для того, чтобы он заработал, попробуйте сначала запустить график (даже может быть пустой график, безлюбые данные), а затем вызовите другие методы для объекта Chart, например addSeries.Что-то в этом роде, но я не видел целое ваше приложение, поэтому сложно написать полностью адаптированное решение.

ngOnInit() {
    this.chart = chart(this.chartTarget.nativeElement, {});
    this.chart.update(this.setHighChartOptions(this.dataObj, ['d1', 'd2', 'error'], this.dataObj.tableName))
    Object.keys(this.dataObj.data).forEach(key =>
    console.log(key, this.dataObj.data[key]))
  }
0 голосов
/ 05 октября 2018

Прежде всего, вы должны быть осторожны, чтобы правильно использовать импорт всех js-пакетов в вашем Angular-проекте:

import { chart } from 'highcharts';
import * as Highcharts from 'highcharts';

Кроме того, вы должны проверить, правильно ли установлен ваш пакет с помощью «npm»?

В конце концов, с моей точки зрения, этот пример может помочь вам лучше понять, как использовать пакет «highcharts» в вашем проекте, другие настройки зависят от версии «highcharts», которую вы используете.

import { Component, ElementRef, ViewChild } from '@angular/core';
import { chart } from 'highcharts';
import * as Highcharts from 'highcharts';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  title = 'Highcharts Sample';

  @ViewChild('chartTarget') chartTarget: ElementRef;

  chart: Highcharts.ChartObject;

  ngAfterViewInit() {
    const options: Highcharts.Options = {
      chart: {
        type: 'bar'
      },
      title: {
        text: 'Sample Title'
      },
      xAxis: {
        categories: ['Top Test', 'Test 2', 'Test3']
      },
      yAxis: {
        title: {
          text: 'Fox Rex'
        }
      },
      series: [{
        name: 'Tomi',
        data: [1, 0, 4]
      }, {
        name: 'Alex',
        data: [5, 7, 3]
      }]
    };

    this.chart = chart(this.chartTarget.nativeElement, options);
  }

  addSeries(){
    this.chart.addSeries({
      name:'Test',
      data:[2,3,7]
    })    
  }
}

и HTML-шаблон образца:

<div #chartTarget>
  chart target sample
</div>

Кроме того, вы должны подавать данные на верхние графики, поскольку формат является стандартным для этого, см. Пример формата данных JSON в примерах на веб-сайте highcharts.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...