High Charts не может динамически добавлять серии

Я впервые использую 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.info(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]
  }]
};

Я продолжаю получать следующие ошибки:

in setHighChartOptions() : Cannot read property 'series' of undefined (at, this.chart.series[0]), & cannot read 'keys' of undefined (at the start of the ForEach loop).

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

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

Ваш highChartOptions - это const, вы не можете изменить const, просто удалите этот префикс

Abel Valdez 06.10.2018 01:32
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
4
1
1 309
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Прежде всего, вы должны быть осторожны, чтобы правильно использовать import all js package в своем проекте 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>

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

Спасибо, я попробую посмотреть, имеет ли это значение

Haq.H 05.10.2018 20:53

Привет, это не работает, когда я хочу показать несколько диаграмм на одной странице. Нужно ли мне определять новый объект диаграммы для каждой диаграммы?

Haq.H 05.10.2018 21:22

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

Haq.H 05.10.2018 21:50

Один хороший способ - создать новый компонент для любого из них, хотя вы можете показать более одного компонента в одном компоненте. Если тип диаграммы для вас не важен, пожалуйста, проверьте диаграммы D3 и C3 вместо Highchart. Кроме того, для объекта диаграммы вы можете иметь один объект и перезаписать его для любой из ваших диаграмм.

Behrouz Pooladrag 05.10.2018 23:22

Я смотрел на это, но как мне использовать функцию addSeries () для добавления в opitons перед установкой объекта диаграммы для такой структуры, как фиктивные данные. Вот где я сталкиваюсь с проблемами при создании экземпляра диаграммы = /

Haq.H 06.10.2018 21:57
Ответ принят как подходящий

Скорее всего, это потому, что вы пытаетесь сослаться на серию, которая еще не определена. Собственно, если вы звоните на 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.info(key, this.dataObj.data[key]))
  }

Да, я тоже в этом разобрался. Я понял, что проблема была вызвана функцией set Options.

Haq.H 09.10.2018 16:54

Другие вопросы по теме