ngx-диаграммы отображают динамические данные

Я новичок в ngx-чартах. Я пытаюсь визуализировать динамические данные биткойнов, получая данные из сервиса битовых меток. Цель состоит в том, чтобы визуально визуализировать данные биткойна (цена и временная метка) на графике (значение и дата (преобразовать в фактическую дату из номера временной метки)), и всякий раз, когда данные биткойна обновляются, данные автоматически помещаются на график. Я пытался применить подобный метод из этого плункера: https://plnkr.co/edit/JSTcS4FnJ5dshAldLWPL?p=preview.

Тем не менее, я получил тонны ошибок в компоненте рыночных данных, таких как:

атрибут d: ожидаемое число, "M0,NaNZ". атрибут cy: ожидаемая длина, "NaN".

Я не знаю, на каком шаге я поступил неправильно. Вот соответствующие сценарии:

bitstamp.service.ts:

import Pusher from 'pusher-js';
import { Injectable, Output, EventEmitter } from '@angular/core';
import { Observable } from 'rxjs/Observable'
import { BehaviorSubject } from "rxjs/Rx";
import { List } from 'immutable';

@Injectable()
export class BitstampService {
  private pusher: any;

  private _messages: BehaviorSubject<any> = new BehaviorSubject(null);
  public messages: Observable<any> = this._messages.asObservable();

  constructor() {
    this.pusher = new Pusher('de504dc5763aeef9ff52');
    this.pusher.logToConsole = true;

    let channel = this.pusher.subscribe('live_trades');
    channel.bind('trade', (data) => {
      this._messages.next(data);
    });
  }
}

маркет-data.component.ts:

import { Component, OnInit } from '@angular/core';
import { BitstampService } from '../../services/bitstamp.service';
import { Subject } from "rxjs/Subject";

@Component({
  selector: 'app-market-data',
  templateUrl: './market-data.component.html',
  styleUrls: ['./market-data.component.scss']
})
export class MarketDataComponent implements OnInit {

  private ngUnsubscribe: Subject<void> = new Subject<void>();

  bitcoinData: any = [
    {
      name: 'Bitcoin',
      series: [
        {
          "name": new Date,
          "value": Number
        }
      ]
    }
  ];

  view: any[] = [960, 500];

  // options
  showXAxis = true;
  showYAxis = true;
  gradient = false;
  showLegend = true;
  showXAxisLabel = true;
  xAxisLabel = 'Year';
  showYAxisLabel = true;
  yAxisLabel = 'USD';
  intervalId:any;

  colorScheme = {
    domain: ['#DC143C', '#A10A28', '#C7B42C', '#AAAAAA']
  };

  // line, area
  autoScale = true;

  constructor(private bitstamp: BitstampService) {
  }

  onSelect(event) {
    console.log(event);
  }

  ngOnInit() {
      this.bitstamp.messages.takeUntil(this.ngUnsubscribe).subscribe(data => {
        if (data != null) {
          this.bitcoinData[0].series.push({"name": new Date(parseInt(data.timestamp)*1000), "value": Math.floor(data.price)});
        }
        this.bitcoinData = [...this.bitcoinData];
      }, (err) => {
        console.log(err);
      });
  }

  ngOnDestroy() {
    this.ngUnsubscribe.next();
    this.ngUnsubscribe.complete();
  }
}

рынок data.component.html:

<ngx-charts-line-chart
        [view]="view"
        [scheme]="colorScheme"
        [results]="bitcoinData"
        [gradient]="gradient"
        [xAxis]="showXAxis"
        [yAxis]="showYAxis"
        [legend]="showLegend"
        [showXAxisLabel]="showXAxisLabel"
        [showYAxisLabel]="showYAxisLabel"
        [xAxisLabel]="xAxisLabel"
        [yAxisLabel]="yAxisLabel"
        [autoScale]="autoScale"
        (select)="onSelect($event)">
      </ngx-charts-line-chart>

Это изображение графика, оно выдвигало данные, но пустой график, и дата, вероятно, всего несколько минут и секунд, не включая живую дату, как я хотел

Заранее спасибо.

1 ответ

Я думаю, что вы сталкиваетесь с проблемами, нажимая метку времени в массиве bitcoinData в вашем market-data-component.ts. С этой строкой:

this.bitcoinData[0].series.push({"name": new Date(parseInt(data.timestamp)*1000), "value": Math.floor(data.price)});

Это должно работать:

this.bitcoinData[0].series.push({"name": String( new Date()), "value": Math.floor(data.price)});

Вы пытаетесь изменить данные не распознается обнаружением изменений.

this.bitcoinData[0].series.push({"name": new Date(parseInt(data.timestamp)*1000), "value": Math.floor(data.price)});

вместо этого попробуйте распределить данные, чтобы обнаружить изменения. У меня это сработало.

this.bitcoinData[0].series = [...this.bitcoinData[0].series, ...[{"name": new Date(parseInt(data.timestamp)*1000), "value": Math.floor(data.price)}];
Другие вопросы по тегам