Получение объекта, по которому щелкнули мышью, из каждого раздела одной панели стека, поскольку моя панель стека имеет несколько разделов Chart. js - PullRequest
0 голосов
/ 17 июня 2020

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

Это мой код .ts файл

this.chart = new Chart("Chart1", {
    type: 'bar',
    data: {
        datasets: [{
            label: 'Data1',
            data: [27],             
        },
        {
            label: 'Data2',
            data: [40],
        },
        {
            label: 'Data3',                
            data: [12],
        }

    ],
    }     
});

showData(evt:any){
  var data = this.chart.getElementsAtEvent(evt)
  console.log(data[0]._model); // it prints the value of the property
}

В data я не получаю данные object скорее получаю chart, но я просто хочу получить запись, по которой щелкнул.

html файл

<div id="mydiv">
  <canvas id="Chart1" (click)="showData($event)"></canvas>
</div>

Это мой бар

enter image description here

1 Ответ

1 голос
/ 17 июня 2020

Вы можете определить функцию showData следующим образом, это также будет, если ваши наборы данных содержат более одного значения:

function showData(evt) {
  const datasetIndex = chart.getElementAtEvent(event)[0]._datasetIndex;
  const index = chart.getElementAtEvent(event)[0]._index;
  const model = chart.getElementsAtEvent(event)[datasetIndex]._model;
  console.log(model.datasetLabel, chart.config.data.datasets[datasetIndex].data[index]);
}

Вместо добавления обработчика событий (click) непосредственно в canvas , Я бы также предпочел определить функцию onClick в параметрах диаграммы следующим образом:

options: {
  onClick: showData,

Пожалуйста, посмотрите фрагмент исполняемого кода.

function showData(evt) {
  const datasetIndex = chart.getElementAtEvent(event)[0]._datasetIndex;
  const index = chart.getElementAtEvent(event)[0]._index;
  const model = chart.getElementsAtEvent(event)[datasetIndex]._model;
  console.log(model.datasetLabel, chart.config.data.datasets[datasetIndex].data[index]);
}

const chart = new Chart("Chart1", {
  type: 'bar',
  data: {
    labels: ['A', 'B'],
    datasets: [{
        label: 'Data1',
        data: [27, 22],
        backgroundColor: 'red'
      },
      {
        label: 'Data2',
        data: [40, 15],
        backgroundColor: 'orange'
      },
      {
        label: 'Data3',
        data: [12, 31],
        backgroundColor: 'blue'
      }
    ]
  },
  options: {
    onClick: showData,
    legend: {
      display: false
    },
    tooltips: {
      enabled: false
    },
    responsive: true,
    scales: {
      xAxes: [{
        stacked: true,
      }],
      yAxes: [{
        stacked: true,
        ticks: {
          beginAtZero: true
        }
      }]
    }
  }
});
canvas {
  max-width: 200px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.9.3/Chart.min.js"></script>
<canvas id="Chart1" height="200"></canvas>
...