Как я передаю массив, полученный в ngOnInti(), графу, который находится за пределами этой функции?

#angular #typescript #highcharts

#угловатый #машинописный текст #highcharts

Вопрос:

Цель:

Моя цель состоит в том, чтобы создать график из данных, которые извлекаются через API и вызываются, а затем преобразуются. Вызов происходит внутри ngOnInit(), а построение графиков происходит вне его. Я не могу получить данные, которые извлекаются, помещаются в график:

 import {Component, OnInit} from '@angular/core';
import {ActivatedRoute} from '@angular/router';
import {StockServicesComponent} from '../services/stock-services.component';
import * as Highcharts from 'highcharts/highstock';
import { Options } from 'highcharts/highstock';

@Component({
  selector: 'app-high-charts',
  templateUrl: './high-charts.component.html',
  styleUrls: ['./high-charts.component.css']
})
export class HighChartsComponent implements OnInit {

  constructor( private route: ActivatedRoute,
               private service: StockServicesComponent) { }

  stockPrices = [];
  dates = [];
  prices = [];
  newDataset = [];

  Highcharts: typeof Highcharts = Highcharts;
  chartOptions: Options = {
    series: [
      {
        type: 'line',
        pointInterval: 24 * 3600 * 1000,
        data : this.newDataset
      }
    ]
  };

  ngOnInit(): void {
    this.route.params.subscribe(params => {
      const tickerId = params.tickerId;
      this.service.findCompanyPriceHistory(tickerId)
        .then(stockPrices => this.stockPrices = stockPrices);
      console.log('Reached Highcharts 1: ', this.newDataset);

      this.stockPrices.forEach(obj => {
        const tmp = [];
        tmp.push(obj.updated);
        tmp.push(obj.close);
        this.newDataset.push(tmp);
        console.log('----------------');
      });
      console.log('Reached Highcharts 2: ', this.newDataset);
    });
  }
}
 

Вопрос:

Как мне передать «NewDataSet» в график, как указано в «data : this.NewDataSet»?

Ответ №1:

Рассмотрим следующую реализацию, в которой обновление данных выполняется в рамках выделенной функции, которая, в свою очередь, запускается после разрешения данных (внутри .then ).:

 public updateDataSet(stockPrices: any[]):void {
  stockPrices.forEach(obj => {
    const tmp = [];
    tmp.push(obj.updated);
    tmp.push(obj.close);
    this.newDataset.push(tmp);
  });
}

ngOnInit(): void {
  this.route.params.subscribe(params => {
    this.service
      .findCompanyPriceHistory(params.tickerId)
      .then(stockPrices => this.updateDataSet(stockPrices));
  });
}
 

Или даже более кратко:

 ngOnInit(): void {
  this.route.params
    .pipe(
      switchMap(x => this.service.findCompanyPriceHistory(x.tickerId))
    )
    .subscribe(stockPrices => this.updateDataSet(stockPrices));
}
 

Ответ №2:

В приведенной ниже демонстрации вы можете найти пример того, как обрабатывать данные из внешней службы.
Это простое локальное решение, но оно может указать вам путь.

 export class AppComponent {
  Highcharts: typeof Highcharts = Highcharts;
  chartOptions: Options;

  constructor(dataService: DataService) {
    this.chartOptions = {
      series: [
        {
          type: "line",
          data: dataService.getData()
        }
      ]
    };
  }
}
 

Демонстрация: https://stackblitz.com/edit/highcharts-angular-data-from-service-2