Я впервые использую 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 я установил параметры диаграммы.
Надеюсь, вы сможете обнаружить мои ошибки и помочь мне. Спасибо.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Прежде всего, вы должны быть осторожны, чтобы правильно использовать 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.
Спасибо, я попробую посмотреть, имеет ли это значение
Привет, это не работает, когда я хочу показать несколько диаграмм на одной странице. Нужно ли мне определять новый объект диаграммы для каждой диаграммы?
Я решил создать отдельный компонент, в который я буду передавать данные, и я могу определить там единую структуру параметров, которую можно использовать для создания нескольких диаграмм, надеюсь, это сработает.
Один хороший способ - создать новый компонент для любого из них, хотя вы можете показать более одного компонента в одном компоненте. Если тип диаграммы для вас не важен, пожалуйста, проверьте диаграммы D3 и C3 вместо Highchart. Кроме того, для объекта диаграммы вы можете иметь один объект и перезаписать его для любой из ваших диаграмм.
Я смотрел на это, но как мне использовать функцию addSeries () для добавления в opitons перед установкой объекта диаграммы для такой структуры, как фиктивные данные. Вот где я сталкиваюсь с проблемами при создании экземпляра диаграммы = /
Скорее всего, это потому, что вы пытаетесь сослаться на серию, которая еще не определена. Собственно, если вы звоните на 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.
Ваш
highChartOptions- этоconst, вы не можете изменитьconst, просто удалите этот префикс