Highcharts Angular动态更新

时间:2018-09-05 03:57:19

标签: angular angular2-highcharts

我想用下面的Observable订阅中的值更新Highcharts量表,但是我不知道如何输入series: data: []值。我看过highchart示例,但它们都包含静态数据。我找不到任何清晰的Angular文档或良好的Angular示例可供学习。我将不胜感激。这是我的ts文件源代码:

import { Component, ViewChild, ElementRef, AfterViewInit, OnInit } from '@angular/core';
import { AuthService } from '../../../../services/auth.service';
import { TempsService } from '../../../shared/temps.service';
import { Temps } from '../../../shared/temps.model';
import More from 'highcharts/highcharts-more';
import { chart } from 'highcharts';
import * as Highcharts from 'highcharts';

More(Highcharts);

@Component({
selector: 'app-gauge',
styleUrls: [ './gauge.component.css'],
templateUrl: './gauge.component.html'
})

export class GaugeComponent implements AfterViewInit, OnInit {

private controller: string;
TT: number;

@ViewChild('container', { read: ElementRef }) container: ElementRef;

constructor(private tempsService: TempsService, public authService: AuthService) { }

ngOnInit() {

this.authService.isLoginSubject.subscribe((photon) => {
  console.log(photon + ' is registered controller in gauge.component');
  this.controller = photon;
});

}

ngAfterViewInit() {

  this.tempsService.getGaugeTemps(this.controller);

if (this.tempsService.currentSubjectTT != null) {
  this.tempsService.currentSubjectTT.subscribe((tt) => {
    console.log('Target Temp is: ' + tt);
    this.TT = tt;
    // I WANT TO UPDATE THE GAUGE HERE...WITH THE VALUE IN this.TT
  });
}

    Highcharts.chart(this.container.nativeElement, {

      credits: {enabled: false},

      plotOptions: {
        gauge: {
          dataLabels: {
            padding: 80,
            borderWidth: 0,
            style: {
              fontSize: '30px'
            }
          }
        }
      },

      chart: {
        type: 'gauge',
        plotBackgroundColor: null,
        plotBackgroundImage: null,
        plotBorderWidth: 0,
        plotShadow: false,
        margin: [0, 0, 0, 0],
        spacingTop: 0,
      },

      title: {
        text: null
      },

      pane: {
        startAngle: -150,
        endAngle: 150,
        background: [{
          backgroundColor: {
            linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
            stops: [
              [0, '#FFF'],
              [1, '#333']
            ]
          },
            borderWidth: 0,
            outerRadius: '109%'
        }, {
          backgroundColor: {
            linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
              stops: [
                [0, '#333'],
                [1, '#FFF']
              ]
            },
            borderWidth: 1,
            outerRadius: '107%'
        }, {
            // default background
        }, {
           backgroundColor: '#DDD',
           borderWidth: 0,
           outerRadius: '105%',
           innerRadius: '103%'
        }]
      },

      // the value axis
      yAxis: {
          min: 0,
          max: 500,
          minorTickInterval: 'auto',
          minorTickWidth: 1,
          minorTickLength: 10,
          minorTickPosition: 'inside',
          minorTickColor: '#666',
          tickPixelInterval: 30,
          tickWidth: 2,
          tickPosition: 'inside',
          tickLength: 15,
          tickColor: '#666',
          labels: {
              step: 4,
              rotation: 'auto'
          },
          title: {
              text: 'F°'
          },
          plotBands: [{
              from: 0,
              to: 150,
              color: '#C0C0C0' // gray
          }, {
              from: 151,
              to: 225,
              color: '#55BF3B' // green
          }, {
              from: 226,
              to: 300,
              color: '#DDDF0D' // yellow
          }, {
              from: 301,
              to: 500,
              color: '#DF5353' // red
          }]
      },

      series: [{
          name: 'Grill',
          data: [0],
          tooltip: {
              valueSuffix: ' F°'
          }
      }]
    });

  }

}

1 个答案:

答案 0 :(得分:1)

获取对图表对象的引用

chart = Highcharts.chart(... someconfig);

当您从服务器获取数据时,只需更新序列并重新绘制图表即可

chart.series[0].update({
    pointStart: newSeries[0].pointStart,
    data: newSeries[0].data
}, true); //true / false to redraw

updateData() {
  chart.series[0].setData([100]);
}

fiddle

更新角度

Package.json

在package.json中添加了以下依赖项

"dependencies": {    
    "highcharts": "^6.0.3", //if you are using angular6
    "@types/node": "^10.1.3"
  }

HTML

<div #chart></div>
<button (click)="setGuageValue(100)">Set value to 100</button>
<button (click)="setGuageValue(160)">Set value to 160</button>

组件

我们需要在highchart中包括以下内容

// tslint:disable-next-line:no-var-requires
const Highcharts = require('highcharts/highstock');
// tslint:disable-next-line:no-var-requires
require('highcharts/highmaps');
require('highcharts/modules/exporting')(Highcharts);
require('highcharts/modules/solid-gauge')(Highcharts);
require('highcharts/highcharts-more')(Highcharts);

export class ChartComponent implements AfterViewInit {
  @ViewChild('chart') public chartElement: ElementRef;
  private chart;

  configuration = {

    credits: {enabled: false},

    plotOptions: {
      gauge: {
        dataLabels: {
          padding: 80,
          borderWidth: 0,
          style: {
            fontSize: '30px'
          }
        }
      }
    },

    chart: {
      type: 'gauge',
      plotBackgroundColor: null,
      plotBackgroundImage: null,
      plotBorderWidth: 0,
      plotShadow: false,
      margin: [0, 0, 0, 0],
      spacingTop: 0,
    },

    title: {
      text: null
    },

    pane: {
      startAngle: -150,
      endAngle: 150,
      background: [{
        backgroundColor: {
          linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
          stops: [
            [0, '#FFF'],
            [1, '#333']
          ]
        },
          borderWidth: 0,
          outerRadius: '109%'
      }, {
        backgroundColor: {
          linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
            stops: [
              [0, '#333'],
              [1, '#FFF']
            ]
          },
          borderWidth: 1,
          outerRadius: '107%'
      }, {
          // default background
      }, {
         backgroundColor: '#DDD',
         borderWidth: 0,
         outerRadius: '105%',
         innerRadius: '103%'
      }]
    },

    // the value axis
    yAxis: {
        min: 0,
        max: 500,
        minorTickInterval: 'auto',
        minorTickWidth: 1,
        minorTickLength: 10,
        minorTickPosition: 'inside',
        minorTickColor: '#666',
        tickPixelInterval: 30,
        tickWidth: 2,
        tickPosition: 'inside',
        tickLength: 15,
        tickColor: '#666',
        labels: {
            step: 4,
            rotation: 'auto'
        },
        title: {
            text: 'F°'
        },
        plotBands: [{
            from: 0,
            to: 150,
            color: '#C0C0C0' // gray
        }, {
            from: 151,
            to: 225,
            color: '#55BF3B' // green
        }, {
            from: 226,
            to: 300,
            color: '#DDDF0D' // yellow
        }, {
            from: 301,
            to: 500,
            color: '#DF5353' // red
        }]
    },

    series: [{
        name: 'Grill',
        data: [0],
        tooltip: {
            valueSuffix: ' F°'
        }
    }]
  };

  ngAfterViewInit(): void {
    this.highchartsShow();
  }

  highchartsShow() {
    this.configuration.chart['renderTo'] = this.chartElement.nativeElement;
    this.chart = Highcharts.chart(this.configuration);
  }

  setGuageValue(value: number) {
    this.chart.series[0].setData([value]);
  }
}

在打字稿代码中使用require在tsconfig.app.json中添加类型和typeRoots

"compilerOptions": {
    "outDir": "../out-tsc/app",
    "module": "es2015",
    "types": ["node"],
    "typeRoots": [
      "node_modules/@types"
    ]
  },