javascript - Chart.js 数据集 Controller 'null' 绘制图表时

标签 javascript jquery json performance chart.js

让我提前道歉。我不是 javascript/web 开发人员,我什至不声称拥有该语言的工作知识或对环境的良好掌握。我是一名嵌入式 C/C++ 程序员,实际上我只学习了足够的 JS 来尝试完成这个小项目,但现在我陷入了一个似乎让我无法深入的错误。

我正在尝试编写一个图形实用程序,我可以将 JSON 格式的按日期性能数据插入其中,以提供与我们的夜间构建/CI 测试相关的性能历史 View ;目标是一目了然地识别每天的任何性能回归。我尝试获取 chart.js line.html 示例并对其进行修改以满足我的需要。它主要工作,除了当页面最初加载时,图表是空白的。但是,当我打开 javascript 控制台进行调试时,它会正确绘制/运行,但我看到此错误:
Chart.bundle.min.js:13 Uncaught TypeError: Cannot read property 'draw' of null(anonymous function)

当我查看图表的配置数据时,数据集中的数据是正确的,但是,数据集的 _meta 字段中的“ Controller ”对象为空,我认为这是导致错误的原因。我不知道该怎么办。也许我没有完全满足初始化数据集对象的要求,但我认为我已经完成了示例所做的一切。我想知道我是否无意中覆盖了对象的某些部分,或者这只是一个排序的事情?我迷路了。

编辑:我刚刚意识到任何调整窗口大小都会导致正确绘制图表。我认为打开 javascript 控制台使其工作纯粹是由于调整了主窗口的大小。当我在调整大小后在控制台中转储配置数据时,_meta.controller 属性不再为空。也许我有一些排序搞砸了或者需要延迟一些东西,但这似乎是一个很大的线索。调整窗口大小后,它似乎 100% 正确运行。我仍然不知道从这里去哪里。

这是代码:

<title>Line Chart</title>
<script src="https://code.jquery.com/jquery-1.10.2.js" charset=UTF-8></script>
<script src="Chart.js/dist/Chart.bundle.min.js"></script>
<style>
canvas{
    -moz-user-select: none;
    -webkit-user-select: none;
    -ms-user-select: none;
}
</style>

在这里关闭头部并打开 body 标签 - 似乎弄乱了代码文本框
<div style="width:75%;">
    <canvas id="canvas"></canvas>
</div>
<br>
<br>
<script>
    var randomColorFactor = function() {
        return Math.round(Math.random() * 255);
    };
    var randomColor = function(opacity) {
        return 'rgba(' + randomColorFactor() + ',' + randomColorFactor() + ',' + randomColorFactor() + ',' + (opacity || '.3') + ')';
    };
    var get_json_data= function(){

      var my_labels = [], my_data = [];
      $.getJSON("perf_data.json", function(json){
      var insert_dataset = {'label': "Insert Performance", 'hidden': false, 'data': [], 'fill': true, 'borderDash': [5,5],
                            'borderColor': randomColor(0.4), 'backgroundColor': randomColor(0.5), 'pointBorderColor': randomColor(0.7),
                            'pointBackgroundColor': randomColor(0.5), 'pointBorderWidth': 1};
      var verify_dataset = {'label': "Verify Performance", 'hidden': false, 'data': [], 'fill': true, 'borderDash': [5,5],
                            'borderColor': randomColor(0.4), 'backgroundColor': randomColor(0.5), 'pointBorderColor': randomColor(0.7),
                            'pointBackgroundColor': randomColor(0.5), 'pointBorderWidth': 1};
      var update_dataset = {'label': "Update Performance", 'hidden': false, 'data': [], 'fill': true, 'borderDash': [5,5],
                            'borderColor': randomColor(0.4), 'backgroundColor': randomColor(0.5), 'pointBorderColor': randomColor(0.7),
                            'pointBackgroundColor': randomColor(0.5), 'pointBorderWidth': 1};
      var delete_dataset = {'label': "Delete Performance", 'hidden': false, 'data': [], 'fill': true, 'borderDash': [5,5],
                            'borderColor': randomColor(0.4), 'backgroundColor': randomColor(0.5), 'pointBorderColor': randomColor(0.7),
                            'pointBackgroundColor': randomColor(0.5), 'pointBorderWidth': 1};

      $.each(json, function (i, date_data) {
          //console.log(date_data);
          my_labels.push(date_data.datestamp);
          $.each(date_data.data, function(j, workload) {
            if (workload['op'] == "insert") {
              insert_dataset.data.push(parseFloat(workload.iops));
            } else if (workload['op'] == "verify" ) {
              verify_dataset.data.push(parseFloat(workload.iops));
            } else if (workload['op'] == "update" ) {
              update_dataset.data.push(parseFloat(workload.iops));
            } else if (workload['op'] == "delete" ) {
              delete_dataset.data.push(parseFloat(workload.iops));
           } else {
              console.log("Scomething went wrong w/ the data parsing.");
            }
          });
        });
        my_data.push(insert_dataset);
        my_data.push(verify_dataset);
        my_data.push(update_dataset);
        my_data.push(delete_dataset);
      })
    .fail(function (d, textStatus, error) {
      console.error("getJSON failed, status: " + textStatus + ", error: "+error)
      });
      return { "labels": my_labels , "datasets": my_data }; 
    };

    config = {};
    config['type'] = "line";
    config['data'] = get_json_data();
    config['options'] = {
            'responsive': true,
            'title':{
                'display':true,
                'text':'TOAD BVT performance'
            },
            'tooltips': {
                'mode': 'label',
                'callbacks': {
                    // beforeTitle: function() {
                    //     return '...beforeTitle';
                    // },
                    // afterTitle: function() {
                    //     return '...afterTitle';
                    // },
                    // beforeBody: function() {
                    //     return '...beforeBody';
                    // },
                    // afterBody: function() {
                    //     return '...afterBody';
                    // },
                    // beforeFooter: function() {
                    //     return '...beforeFooter';
                    // },
                    // footer: function() {
                    //     return 'Footer';
                    // },
                    // afterFooter: function() {
                    //     return '...afterFooter';
                    // },
                }
            }
          };
    config['hover'] = { 'mode': 'dataset' };
    config['scales'] = {
                'xAxes': [{
                    'display': true,
                    'scaleLabel': {
                        'show': true,
                        'labelString': 'Date'
                    }
                }],
                'yAxes': [{
                    'display': true,
                    'scaleLabel': {
                        'show': true,
                        'labelString': 'IOPS'
                    },
                    'ticks': {
                        'suggestedMin': 0,
                        'suggestedMax': 5000000
                    }
                }]
            };

    window.onload = function() {
        var ctx = document.getElementById("canvas").getContext("2d");
        window.myLine = new Chart(ctx, config);
    };

</script>

这是我的 JSON 输入文件示例:
[
{
  "datestamp":"01/01/16",
   "data":[
      {"op":"insert", "iops":"83934.51429194942"},
      {"op":"verify", "iops":"15439.723320158104"},
      {"op":"update", "iops":"53198.20988023753"},
      {"op":"delete", "iops":"47994.31747281122"}
    ]
},
{
  "datestamp":"01/02/16",
  "data":[
      {"op":"insert", "iops":"84934.51429194942"},
      {"op":"verify", "iops":"14439.723320158104"},
      {"op":"update", "iops":"54198.20988023753"},
      {"op":"delete", "iops":"44994.31747281122"}
  ]
}
]

任何帮助或想法表示赞赏。谢谢!

最佳答案

我有一个类似的案例。我使用了第一个 js 文件中的配置,以及在第二个 js 文件中创建图表的代码。绘制图表后,出现错误:“ Controller 为空”。我通过“扩展”方法进行深度复制解决了这个问题(但我使用了 JQuery)。
第一个文件中的默认构造函数:

const standart_chart = {
  type: 'bar',
  options: {}, 
  ...
}
在第二个文件中添加数据并创建图表:
var ctx = $('#chart');
var chart = jQuery.extend(true, {}, standart_chart);
chart.data = barChartData;

var chart_obj = new Chart(ctx, chart);

关于javascript - Chart.js 数据集 Controller 'null' 绘制图表时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37551614/

相关文章:

javascript - 类似 Excel 的 PHP 和 AJAX 中没有按钮的表格更新

javascript - 在 pug 中将 JSON 作为 javascript 变量传递

json - 解码 JSON 值,可以是字符串或数字

javascript - 如何动态调整vue组件中的文本大小

javascript - 使用 jQuery 检测第一页加载?

jQuery:如何将其转换为 1.3.2?

javascript - 识别纯文本句子中的推特句柄

json - 如何在 Spark 2 Scala 中将 Row 转换为 json

javascript - 如何在 Angular 2 中发出 @Output 事件

javascript - Angular js - 从 Controller 调用 data-modal-target