Загружать больше исторических данных в линейные диаграммы при панорамировании влево

Я рисую данные линейной диаграммы, используя ChartsModule из ng2-charts. Я также добавил плагин для включения масштабирования и панорамирования.

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

Я получаю событие onPanComplete при панорамировании диаграммы и могу обновить наборы данных, но не знаю, как я узнаю, что пользователь достиг левого края диаграммы, чтобы я загружал больше данных и обновлял наборы данных.

Ниже мой компонент диаграммы:

import { Component, OnInit } from '@angular/core';

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

export class ChartComponent implements OnInit {
  lineChartData: any;
  chartDataSets: any;

  constructor() { }
  public lineChartOptions
  ngOnInit() {
    var sampleData = [
      {
        "CreateDate": "2019-08-12 15:30:03",
        "NewBuyValue": "16,791.658178"
      },
      {
        "CreateDate": "2019-08-12 14:30:29",
        "NewBuyValue": "16,760.46713691"
      },
      {
        "CreateDate": "2019-08-12 13:30:31",
        "NewBuyValue": "16,792.80212024"
      },
      {
        "CreateDate": "2019-08-12 12:30:27",
        "NewBuyValue": "16,740.86970638"
      }
    ].map(d => {
      return {
        t: new Date(d.CreateDate),
        y: d.NewBuyValue.replace(',', '')
      }
    })
    this.chartDataSets = [{
      label: 'Buy Price',
      backgroundColor: "#2072ef",
      borderColor: '#2072ef',
      type: 'line',
      pointRadius: 0,
      fill: false,
      lineTension: 0,
      borderWidth: 2,
      data: sampleData
    }]

    this.lineChartOptions = {
      pan: {
        enabled: true,
        mode: 'x',
        onPan: function (e) {
          console.log(`I'm panning!!!`, e);
        },
        onPanComplete: function (e) {
          console.log(`I was panned!!!`, e);
          e.chart.config.data.datasets[0].data.pop()
        }
      },
      zoom: {
        enabled: true,
        mode: 'x',
      },
      hover: {
        mode: 'nearest',
        intersect: true
      },
      responsive: true,
      scales: {
        xAxes: [{
          scaleLabel: {
            display: true,
            labelString: 'Time'
          },
          type: 'time',
          distribution: 'series',
          ticks: {
            source: 'data',
            autoSkip: false
          }
        }],
        yAxes: [{
          scaleLabel: {
            display: true,
            labelString: 'Prices'
          }
        }]
      },
      tooltips: {
        intersect: false,
        mode: 'index',
        callbacks: {
          label: function (tooltipItem, myData) {
            var label = myData.datasets[tooltipItem.datasetIndex].label || '';
            if (label) {
              label += ': ';
            }
            label += parseFloat(tooltipItem.value).toFixed(2);
            return label;
          }
        }
      }
    }
    this.lineChartData = []
  }
}

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


person Suresh Prajapati    schedule 13.08.2019    source источник


Ответы (1)


Я загрузил данные за 1 неделю и обновил time.min для xAxis к значению начала текущей даты. Вот и трюк

this.lineChartOptions.scales.xAxes[0].time.min = chartData.data[0].t - 24 * 3600000
person Suresh Prajapati    schedule 07.10.2019