【问题标题】:Dynamically add rows to Google Charts using JQuery loop使用 JQuery 循环向 Google 图表动态添加行
【发布时间】:2019-01-25 18:41:41
【问题描述】:

我想循环从 C# 返回的 JSON 以动态地将行添加到谷歌图表。我一次又一次地使用相同的代码,它不会加载到图表中。

我可以看到 Json 返回浏览器并使用 RestClient 对其进行了测试,因此我很高兴 C# 位可以正常工作,但我不明白为什么 Json 不会加载到 Google 折线图中并创建折线。图表Cannot read property 'getTime' of null 上显示错误。我尝试了几种不同的方法来为 data.AddRow 创建数组。

JQuery Ajax 调用:

$.ajax({
    url: '@Url.Action("GetJsonChartData", "ProjectCharts")',
    datatype: 'json',
    type: 'get',
    async: false,
    data: { serial: serial, uid: uid, from: from, to: to },
    contentType: 'application/json; charset=utf-8',
    success: function (d) {
        $.each(d, function (index, item) {                        
            data.addRow([new Date(item.ReadingDate), Number(item.ReadingValue), item.ToolTip]);                   
        });
    },
    error: function () {
        alert("Error loading chart data.")
    } 
});

我的 Json 看起来像:

   [{
    "ReadingDate": "2018-12-04 09:43:39",
    "ReadingValue": "17.5",
    "ToolTip": "Tue, 04 Dec 18 09:43\r\n Value: 17.5"
  },
  {
    "ReadingDate": "2018-12-04 09:45:39",
    "ReadingValue": "16.8",
    "ToolTip": "Tue, 04 Dec 18 09:45\r\n Value: 16.8"
  },
  {
    "ReadingDate": "2018-12-04 09:47:39",
    "ReadingValue": "16.1",
    "ToolTip": "Tue, 04 Dec 18 09:47\r\n Value: 16.1"
  },
  {
    "ReadingDate": "2018-12-04 09:49:39",
    "ReadingValue": "15.7",
    "ToolTip": "Tue, 04 Dec 18 09:49\r\n Value: 15.7"
  }]

我按如下方式创建 Json:

public JsonResult GetJsonChartData(string serial, string uid, string from, string to) {           
    var g = new GetChartData(_configuration);
    var items = g.GetChartDataFromSqlServer(serial, uid, f, t);
    return Json(JsonConvert.SerializeObject(items, Formatting.Indented));
} 

TIA

【问题讨论】:

    标签: c# jquery json google-visualization


    【解决方案1】:

    图表似乎画得很好,使用相同的数据,只是在这里硬编码......

    请参阅以下工作 sn-p...

    google.charts.load('current', {
      packages: ['corechart']
    }).then(function () {
      var data = new google.visualization.DataTable();
      data.addColumn({type: 'date', label: 'Date'});
      data.addColumn({type: 'number', label: 'Value'});
      data.addColumn({type: 'string', role: 'tooltip'});
    
      var d = [{
        "ReadingDate": "2018-12-04 09:43:39",
        "ReadingValue": "17.5",
        "ToolTip": "Tue, 04 Dec 18 09:43\r\n Value: 17.5"
      },
      {
        "ReadingDate": "2018-12-04 09:45:39",
        "ReadingValue": "16.8",
        "ToolTip": "Tue, 04 Dec 18 09:45\r\n Value: 16.8"
      },
      {
        "ReadingDate": "2018-12-04 09:47:39",
        "ReadingValue": "16.1",
        "ToolTip": "Tue, 04 Dec 18 09:47\r\n Value: 16.1"
      },
      {
        "ReadingDate": "2018-12-04 09:49:39",
        "ReadingValue": "15.7",
        "ToolTip": "Tue, 04 Dec 18 09:49\r\n Value: 15.7"
      }];
    
      $.each(d, function (index, item) {
        data.addRow([new Date(item.ReadingDate), Number(item.ReadingValue), item.ToolTip]);
      });
    
      var chart = new google.visualization.LineChart(document.getElementById('chart'));
      chart.draw(data);
    });
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <script src="https://www.gstatic.com/charts/loader.js"></script>
    <div id="chart"></div>

    【讨论】:

    • 请您分享其余的 javascript 代码,或者有什么不同的地方吗?
    • 我在这里创建了一个小提琴,我已经硬编码了一些值以使其更容易测试。 jsfiddle.net/hmz9ro45/1
    • 我在控制台中也遇到了一个错误 - 'Uncaught TypeError: Cannot use 'in' operator to search 'length' in [' 然后 json 的其余部分如下......
    • 我确信图表会在数据返回之前加载。
    • 尝试将所有图表代码放入成功回调中
    【解决方案2】:

    我仍然不知道为什么这在另一个应用程序中有效并且在这个应用程序中不起作用。我注意到 for each 循环没有被命中,并且我在控制台中收到有关 Json 数据的错误,如上所示。它将来自 C# 的 Json 返回字符串视为一个长对象。

    我将 parseJSON 添加到 JQuery 中并且它工作正常。

     $.ajax({
                url: 'ProjectCharts/GetJsonChartData',
                datatype: 'json',
                type: 'get',
                async: false,
                data: { serial: serial, uid: uid, from: from, to: to },
                contentType: 'application/json; charset=utf-8',
                success: function (d) {
                    var parsedData = $.parseJSON(d);
                    console.log("data: " + parsedData);               
                    $.each(parsedData, function (index, item) {                    
                        data.addRow([new Date(item.ReadingDate), Number(item.ReadingValue)]);
                    });
                },
                error: function () {
                    alert("Error loading chart");
                }
    

    如果有人可以向我解释为什么这最初不起作用,我真的很想知道。

    【讨论】:

      猜你喜欢
      • 2015-03-25
      • 1970-01-01
      • 1970-01-01
      • 2012-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多