Chart.js не обновлять несколько диаграмм независимо

#javascript #html #canvas #chart.js

Вопрос:

Это должно создавать отдельные диаграммы. Однако при запуске они идентичны, а значения для индекса меняются от 0 до 1, что означает, что индекс меняется (что меня смущает, почему это произошло). Может ли кто-нибудь объяснить, что происходит. У меня складывается впечатление, что где-то я смешиваю переменные, которые я использую для ссылки на две диаграммы, в результате чего они идентичны.

 window.addEventListener(`load`, () =gt; {  Chart.defaults.plugins.tooltip.enabled = false;  let data = {  labels: (() =gt; {  let arr = [];  for(let i = 0;i lt; 31;i  ) {  arr.push((30 - i) * -2);  }  return arr;  })(),  datasets: [  {  label: `first`,  data: (() =gt; {let arr = [];for(let i = 0;i lt; 31;i  ){arr.push(Math.random())}return arr})(),  borderColor: 'rgb(75, 192, 192)',  },  {  label: `second`,  data: (() =gt; {let arr = [];for(let i = 0;i lt; 31;i  ){arr.push(Math.random())}return arr})(),  borderColor: 'rgb(75, 0, 192)',  }  ]  }  let graphs = [];  for(let i = 0;i lt; 2;i  ) {  graphs.push(new lineGraph(data, data.labels.length));  }  setInterval(() =gt; {  for(let i = 0;i lt; graphs.length;i  ) {  graphs[i].updateData({first: [i], second: [i]})  }  }, 1000) })  function lineGraph(data, maxDataSize) {  let div = document.createElement(`div`);  div.classList.add(`module`, `module-line`);   let canvas = document.createElement(`canvas`);  canvas.classList.add(`canvas-line`);  canvas.width = 200;  canvas.height = 200;   div.appendChild(canvas);  this.div = document.body.appendChild(div);  this.canvas = this.div.getElementsByClassName(`canvas-line`).item(0);  this.ctx = this.canvas.getContext(`2d`);  this.chart = new Chart(this.ctx, {  type: `line`,  data: data,  })  this.updateData = (data) =gt; { // data =gt; {datasetlabel: [data], ...}  this.chart.data.datasets.forEach((dataset, index) =gt; {  let newData = data[dataset.label];  if(newData) {  if(dataset.data.length gt;= maxDataSize) {  for(let i = 0;i lt; (dataset.data.length - maxDataSize)   newData.length;i  ) {  dataset.data.shift();  }  }  dataset.data.push(...newData);  }  });  this.chart.update();  }  return this; }  

Ответ №1:

В настоящее время внутри setInterval вы поочередно обновляете обе диаграммы значениями y 0 и 1 . Вместо этих значений используйте Match.random() то же, что и при инициализации диаграммы data .

 setInterval(() =gt; {  for (let i = 0; i lt; graphs.length; i  ) {  graphs[i].updateData({  first: [Math.random()],  second: [Math.random()]  })  } }, 1000)  

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

 window.addEventListener(`load`, () =gt; {  Chart.defaults.plugins.tooltip.enabled = false;  let data = {  labels: (() =gt; {  let arr = [];  for (let i = 0; i lt; 31; i  ) {  arr.push((30 - i) * -2);  }  return arr;  })(),  datasets: [{  label: `first`,  data: (() =gt; {  let arr = [];  for (let i = 0; i lt; 31; i  ) {  arr.push(Math.random())  }  return arr  })(),  borderColor: 'rgb(75, 192, 192)',  },  {  label: `second`,  data: (() =gt; {  let arr = [];  for (let i = 0; i lt; 31; i  ) {  arr.push(Math.random())  }  return arr  })(),  borderColor: 'rgb(75, 0, 192)',  }  ]  }  let graphs = [];  for (let i = 0; i lt; 2; i  ) {  graphs.push(new lineGraph(data, data.labels.length));  }  setInterval(() =gt; {  for (let i = 0; i lt; graphs.length; i  ) {  graphs[i].updateData({  first: [Math.random()],  second: [Math.random()]  })  }  }, 1000) })  function lineGraph(data, maxDataSize) {  let div = document.createElement(`div`);  div.classList.add(`module`, `module-line`);   let canvas = document.createElement(`canvas`);  canvas.classList.add(`canvas-line`);  canvas.width = 200;  canvas.height = 40;   div.appendChild(canvas);  this.div = document.body.appendChild(div);  this.canvas = this.div.getElementsByClassName(`canvas-line`).item(0);  this.ctx = this.canvas.getContext(`2d`);  this.chart = new Chart(this.ctx, {  type: `line`,  data: data,  })  this.updateData = (data) =gt; {  this.chart.data.datasets.forEach((dataset, index) =gt; {  let newData = data[dataset.label];  if (newData) {  if (dataset.data.length gt;= maxDataSize) {  for (let i = 0; i lt; (dataset.data.length - maxDataSize)   newData.length; i  ) {  dataset.data.shift();  }  }  dataset.data.push(...newData);  }  });  this.chart.update();  }  return this; } 
 lt;script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/3.6.0/chart.min.js"gt;lt;/scriptgt;