How to setup highcharts-angular

2 분 소요

Highcharts-Angular는 Highcharts를 Angular에서 사용하기 쉽도록 작성된 library 입니다.

이 글에서는 Highcharts와 Highcharts-Angular를 설치하는 방법을 알아보고,
Highchart-Angular에서 제공하는 기본 Input에 대하여 정리하겠습니다.

왜 Highcharts-Angular를 사용하는가?

Highcharts는 사실 다른 library를 추가로 설치하지 않아도 Angular 환경에서 충분히 사용할 수 있습니다.
예를 들어 Angular에서 다음과 같이 작성하면 highcharts-angular의 도움 없이도 충분히 사용이 가능합니다.

<div id="chart-line"></div>
import * as Highcharts from 'highcharts';

export class HighchartsComponent implements OnInit {
  chart: any;

  ngOnInit(): void {
    this.chart = Highcharts.chart({
      chart: {
        renderTo: 'chart-line',
      },
      series: [{
        data: [1, 2, 3],
        type: 'line'
      }],
    } as any)
  }
}

그러면 왜 highcharts-angular를 활용하는 것이 좋을까요?

  • zone.js의 이벤트를 handling할 수 있습니다. zone의 도움 없이 강제로 이벤트를 fire 하거나 또는 로직을 수행하고 angular outside에 태워 이벤트를 강제로 태우지 않을 수도 있습니다.
  • option만 주입하는 간단한 형태로 코드를 구성할 수 있습니다. 즉, 이전에는 Highcharts.chart를 통해 인스턴스를 생성하고, 이를 컨트롤했다면 highcharts-angular는 옵션만 해당 component에 주입하면 적용되는 형태로 간단해졌습니다. 만일 기존 코드를 동일하게 구성하려면 observable 패턴을 구성해야 하는 번거로움이 있습니다.
  • 원한다면 highcharts-angular에서 chart 인스턴스를 output하여 활용할 수도 있습니다. 차트를 작성하는 코드 구성은 간단해지면서도 모든 기능을 다룰 수 있는 형태를 갖추고 있습니다.
  • chart의 명령을 몰라도 옵션을 컨트롤하여 chart의 대부분의 기능을 사용할 수 있습니다. 관련해서는 다음에 보다 더 자세히 다룰 예정입니다.

How to Set-up

당연한 말이겠지만 highcarts-angular를 사용하기 위해서는 반드시 highcharts를 install 해야 합니다.
또한 highcharts-angular는 module을 반드시 import 해야 합니다.

npm i highcharts
npm i highcharts-anguilar
import { HighchartsChartModule } from 'highcharts-angular'
...
@NgModule({
   imports: [
      HighchartsChartModule
   ]
})

How to Use

Template

highcharts-angular에서 제공하는 기본 옵션은 다음과 같습니다.

<highcharts-chart 
  [Highcharts]="Highcharts"
  [constructorType]="chartConstructor"
  [options]="chartOptions"
  [callbackFunction]="chartCallback"
  [(update)]="updateFlag"
  [oneToOne]="oneToOneFlag"
  [runOutsideAngular]="runOutsideAngularFlag">
</highcharts-chart>

Attribute를 살펴 보면 다음과 같습니다.

  • highcharts: typeof Highcharts // required, highcharts 변수를 전달해야 합니다.
  • chartConstructor: string = 'chart'; // optional, chart의 종류를 정의 합니다. 가능한 옵션은 ‘chart’, ‘stockChart’, ‘mapChart’, ‘ganttChart’ 입니다.
  • chartOptions: Highcharts.Options = { ... }; // required, 차트를 구성하는 값을 전달해야 합니다.
  • chartCallback: Highcharts.ChartCallbackFunction = function (chart) { ... } // optional, 생성된 차트의 callback 함수입니다.
  • updateFlag: boolean = false; // optional, chart 생성 후 조작할 때 update를 true로 주면 강제로 trigger 할 수 있습니다. true 값은 trigger가 적용되면 false로 변경됩니다.
  • oneToOneFlag: boolean = true; // optional, seires, xAxis, yAxis를 추가 또는 제거할 때 사용합니다. update와는 다르게 기존 값을 입력된 값으로 교체하지 않고, 주입된 값을 기존 값에 추가 또는 제거하는 방식으로 적용합니다.
  • runOutsideAngular: boolean = false; // optional, 강제로 not trigger 됩니다. 이후 updateFlag를 통해 한꺼번에 trigger를 시도하면 좋은 효율을 가질 수 있습니다.

Component

위에서 required로 전달할 값을 정의하는 법을 알아보고, highcharts를 import 하는 방법을 알아봅시다.
highcharts는 별도의 d.ts를 제공하지 않으므로 declare된 모든 값을 import 해야 합니다.

import * as Highcharts from 'highcharts';

...
export class HighchartsComponent {
  Highcharts = Highcharts;
  chartConstructor = 'chart';
  chartOptions = {
    series: [{
      data: [1, 2, 3],
      type: 'line'
    }]
  };
  chartCallback;
  updateFlag = false;
  oneToOneFlag = false;
  runOutsideAngularFlag = false;
}

Loading Module / Plugin

highcharts는 추가 모듈을 제공하는데 이를 typescript 또는 angular 에서 import하려면 일반적이지 않은 방법을 적용해야 합니다. 해당 module을 import한 뒤 import한 모듈에 정의한 chart 변수를 주입해야 합니다.
Plugin도 방식은 동일합니다.

import HC_exporting from 'highcharts/modules/exporting';
HC_exporting(Highcharts);

SSR

ssr에서는 highchart가 로드되기 전에 호출되는 것을 방지하기 위해 chart 변수에 값이 정의되기 전에 화면에 노출되지 않도록 ngIf를 추가해야 합니다.
그렇지 않으면 아직 값이 적용되지 않은 변수를 highcharts-angular에 주입을 시도하므로 에러가 발생합니다.

<highcharts-chart 
  *ngIf="Highcharts"
  [Highcharts]="Highcharts"
  [constructorType]="chartConstructor"
  [options]="chartOptions"
  [callbackFunction]="chartCallback"
  [(update)]="updateFlag"
  [oneToOne]="oneToOneFlag"
  [runOutsideAngular]="runOutsideAngularFlag">
</highcharts-chart>

Reference

Highcharts-Angular

댓글남기기