【问题标题】:Live Update Callback -> afterTitle with Array via JSON fileLive Update Callback -> afterTitle with Array via JSON file
【发布时间】:2020-03-11 04:12:45
【问题描述】:

我正在制作一个图表,我每 5 秒更新一次图表,数据进入。我可以设法从数据库中获取信息并非常容易地更新它,但我只是遇到了一个问题with 涉及设置图表一部分的路径,在这种情况下:options->tootltips->callbacks->afterTitle 并在其中创建一个数组并将数组从 JSON 传递到回调内的数组。

我需要做的,简而言之,因为我已经创建了一个函数来更新我的数据和标签中的信息,所以我需要在 inside this function,指向 afterTitle 的路径,然后我将能够发送第五个数组,其中存储数据。正如您在我的函数中看到的那样,我可以设法为数据和标签做到这一点。

不能有另一个更新的函数,所以基本上我不能有 2 个 loadData(),因为它使 Chart 每次更新时都会闪烁,而事实并非如此我的目标是什么(图表不能闪烁)。

在这个补丁里面,我做了一个不起作用的例子,就是 //:

$.getJSON('loadchart.php', function(response) {
          myLineChart.data.datasets[0].data = response[0];
          myLineChart.data.datasets[1].data = response[1];
          myLineChart.data.datasets[2].data = response[2];
          myLineChart.data.datasets[3].data = response[3];
          myLineChart.data.labels = response[4];

          //The response array that I need is response[5];
          //myLineChart.options.tooltips.callbacks[1] = return response[tooltipItem[0]['index']]; 
          myLineChart.update();
        });

我所有的图表,所以你可以看到路径:

 <script>

    function loadData() {
      $.getJSON('loadchart.php', function(response) {
        myLineChart.data.datasets[0].data = response[0];
        myLineChart.data.datasets[1].data = response[1];
        myLineChart.data.datasets[2].data = response[2];
        myLineChart.data.datasets[3].data = response[3];
        myLineChart.data.labels = response[4];

        myLineChart.update();
      });
    }

    loadData();
    setInterval(loadData, 5000);

    var lbl = [];
    var ctx1 = document.getElementById('mychart1').getContext('2d');

    var myLineChart = new Chart(ctx1, {
        type: 'line', 
        data: {
          labels: lbl,
          datasets: [
            {
              label: "Corrente 1",
              data: [],
              borderWidht: 6,
              borderColor: 'red',
              backgroundColor: 'transparent'
            },
            {
              label: "Corrente 2",
              data: [],
              borderWidht: 6,
              borderColor: 'blue',
              backgroundColor: 'transparent'
            },
            {
              label: "Corrente 3",
              data: [],
              borderWidht: 6,
              borderColor: 'green',
              backgroundColor: 'transparent'
            },
            {
              label: "Corrente Total",
              data: [],
              borderWidht: 6,
              borderColor: 'black',
              backgroundColor: 'transparent'
            },
          ]            
        },
        options: {
          animation:{
            update: 0
          },
          scales: {
            yAxes: [{
              ticks: {
                beginAtZero: true
              }
            }],
            xAxes: [{
              gridLines: {
                display: false
              }
            }]
          },

          title: {
            display: true,
            fontSize: 20,
            text: "Gráfico das Correntes"
          },

          labels: {
            fontStyle: "bold",
          },

          layout: {
            padding: {
              left: 0,
              right: 0,
              top: 0,
              bottom: 0
            }
          },
          tooltips: {
            enabled: true,
            mode: 'single',
            responsive: true,
            backgroundColor: 'black',
            titleFontFamily: "'Arial'",
            titleFontSize: 14,
            titleFontStyle: 'bold',
            titleAlign: 'center',
            titleSpacing: 4,
            titleMarginBottom: 10,
            bodyFontFamily: "'Mukta'",
            bodyFontSize: 14,
            borderWidth: 2,
            borderColor: 'grey',
            callbacks:{
              title: function(tooltipItem, data) {
                  return data.labels[tooltipItem[0].index];
              },
              afterTitle: function(tooltipItem, data) {
                var tempo = [];
                return tempo[tooltipItem[0]['index']];
              },
              label: function(tooltipItem, data) {
                    var label = data.datasets[tooltipItem.datasetIndex].label || '';                  
                    if (label) {
                        label += ': ';
                    }
                    label += (tooltipItem.yLabel)+"A";                  
                    return label;
              }
            }
          },
          aspectRatio: 1,
          maintainAspectRatio: false
        }
    });
</script>

我需要的是这个:

afterTitle: function(tooltipItem, data) {
                var tempo = [];
                return tempo[tooltipItem[0]['index']]; 

【问题讨论】:

  • 您的响应“5”将要求您获取或创建一个包含如此多条目的数据数组。您只有 4 个。 myLineChart.options.tooltips.callbacks[1] 将不起作用,因为这是一个对象,您使用数组的语法。所以我建议检查你的 php 以产生你需要的数据结构。 JSON 驴桥 [I AM A ARRAY] {我是一个对象}。
  • 问题是,我将如何每 5000 秒更新一次这些数据,我已经创建了所有路径等,如果我从那里找到方法会更容易
  • 我需要更新这个数组,并在我有 chart.update() 时发送它

标签: javascript arrays json chart.js


【解决方案1】:

这将显示一个时钟,但您也可以将其设置为 5000 秒并调用您的图表更新。我建议加入某种 AJAX 让它异步工作。

            <!DOCTYPE html>
            <html>
            <head>
            <script>
            function startTime() {
              var today = new Date();
              var h = today.getHours();
              var m = today.getMinutes();
              var s = today.getSeconds();
              m = checkTime(m);
              s = checkTime(s);
              document.getElementById('txt').innerHTML =
              h + ":" + m + ":" + s;
              var t = setTimeout(startTime, 500);  //<----  !!!
            }
            function checkTime(i) {
              if (i < 10) {i = "0" + i};  // add zero in front of numbers < 10
              return i;
            }
            </script>
            </head>

            <body onload="startTime()">

            <div id="txt"></div>

            </body>
            </html>

【讨论】:

  • 我不明白如何在我的图表中实现这一点。如果你可以用数据库数据做一个例子,我需要从我的数据库中获取信息。我的图表中不能有 2 次超时,因为它会使图表闪烁。
  • 那你就得等到周一了,这个休息周我可没时间玩了。这个想法是粗略地使用一个计时器作为 ajax 例程启动所有 5000 秒,然后通过它的回调更新图表。不会有闪烁。它的JavaScript。您无需重新加载页面即可更新 html。
  • 如果你能在星期一帮助我,我将不胜感激,谢谢!
【解决方案2】:

正如您在 afterTitle 函数中提到的那样,您想要创建一个数组并将该数组从 JSON 传递到回调内的一个数组,而缺少的部分是您正在创建一个数组 tempo 并将其视为一个对象tempo[tooltipItem[0]['index']];,但是你需要做的是把这个对象tooltipItem[0]['index']推到tempo数组中。

请用下面的代码替换afterTitle函数

afterTitle: function(tooltipItem, data) {
            var tempo = [];
            return tempo.push(tooltipItem[0]['index']); 

【讨论】:

  • 好吧,但是如果我没有在我的代码中的任何地方插入它们, tempo[] 将如何接收值?我应该把节奏数组放在哪里?在 JSON 文件中?你能试着解释一下吗?
猜你喜欢
  • 2022-12-02
  • 2013-05-09
  • 1970-01-01
  • 2022-12-28
  • 1970-01-01
  • 2012-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多