Когда я использую функцию Highcharts.stockChart
, импортированную из highcharts/highstock
, я получал следующие ошибки (при нажатии):
highstock.src.js:3417 Error: <rect> attribute width: Expected length, "NaN".
и highstock.src.js:3417 Error: <rect> attribute x: Expected length, "NaN".
Если я использую highcharts версии 8.0.0 (или 7.1.2), я не получаю никаких ошибок.
Сначала я думал, что эти ошибки были вызваны моим набором данных, поэтому Я продолжаю издеваться над ним, но это не сработало. Затем я попытался издеваться над «опциями» объекта, переданными в функцию Highcharts.stockChart(domElement, options)
, но опять же, это не сработало. Даже чистый вызов этой функции не работает: Highcharts.stockChart(domElement, {})
Stackblitz: https://stackblitz.com/edit/angular-playground-qdw6ll (файл tds-chart.component.ts - посмотрите на Chrome консоль DevTools, чтобы увидеть сообщения об ошибках)
Это код моего компонента (проверьте функцию updateOrCreateChart
):
import {
ChangeDetectionStrategy,
ChangeDetectorRef,
Component,
ElementRef,
Input,
NgZone,
OnDestroy,
OnInit
} from '@angular/core';
import { Chart, Options } from 'highcharts';
import { BehaviorSubject, Subscription } from 'rxjs';
import * as Highcharts from 'highcharts/highstock';
@Component({
selector: 'tds-chart',
template: '<div id="myDiv"></div>',
exportAs: 'tdsChart',
changeDetection: ChangeDetectionStrategy.OnPush
})
// tslint:disable-next-line: component-class-suffix
export class TdsChart implements OnDestroy, OnInit {
private _options$ = new BehaviorSubject<Options>(null);
private _sub: Subscription;
private _chart: Chart;
@Input() constructorType: string;
@Input() oneToOne = false;
@Input() runOutsideAngular = true;
@Input() callbackFunction: (chart: Chart) => void;
@Input() set options(val: Options) {
this._options$.next(val);
}
get chart() {
return this._chart;
}
constructor(
private el: ElementRef,
private _zone: NgZone,
private _cd: ChangeDetectorRef
) { }
ngOnInit() {
this._sub = this._options$.subscribe(() => this.wrappedUpdateOrCreateChart());
}
redraw() {
this._options$.next(this._options$.value);
}
private wrappedUpdateOrCreateChart() {
if (this.runOutsideAngular) {
this._zone.runOutsideAngular(() => {
setTimeout(() => {
this.updateOrCreateChart();
this._cd.markForCheck();
}, 1);
});
} else {
setTimeout(() => {
this.updateOrCreateChart();
this._cd.markForCheck();
}, 1);
}
}
private updateOrCreateChart() {
if (this._chart) {
// to do
} else {
this._chart = Highcharts.stockChart('myDiv', {}, null);
}
}
ngOnDestroy() {
if (this._sub) {
this._sub.unsubscribe();
}
if (this._chart) {
this._chart.destroy();
this._chart = null;
}
}
}