【问题标题】:Refresh Google Chart Dashboard刷新谷歌图表仪表板
【发布时间】:2017-07-09 16:55:08
【问题描述】:

我正在尝试使用来自服务器的数据刷新 Google 图表仪表板。但是当我刷新数据时,ControlWrapper 出现错误。初始加载工作正常 - 但是当我从服务器获取另一组数据时,我似乎无法使用滑块 - 我收到一条错误消息:

JSFIDDLE:https://jsfiddle.net/9aktz4s3/4/

注意:在 JSFiddle 中,它不适用于初始加载,因为我有 未设置任何默认数据 - 但 JSFiddle 中的问题与我得到的相同 当我刷新数据时

这是我的 HTML:

<!--Div that will hold the dashboard-->
<div id="scorecard_dashboard_div" class="row">
    <!--Divs that will hold each control and chart-->
    <div id="scorecard_chart_div"></div>
    <div id="scorecard_filter_div"></div>
</div>

这就是我初始化仪表板的方式:

var scorecardChartData;
var scorecardChart;
var scorecardDashboard;
var scoreCardRangeSelector;

var scorecardChartOptions = {
  legend: {    position: "top"  },
  chartArea: {    width: "90%"  },
  xptColumns: [{
    id: "dateid",    label: "Date",    type: "date"  }, {
    id: "brakingid",    label: "Brakings",    type: "number"  }, {
    id: "distanceTravelledid",    label: "Distance Travelled",    type: "number"  }, ]
};


function initViolationChart() {
  scorecardChartData = new google.visualization.DataTable();

  // add columns to the chart
  for (let i = 0; i < scorecardChartOptions.xptColumns.length; i++) {
    var column = scorecardChartOptions.xptColumns[i];
    scorecardChartData.addColumn(column.type, column.label, column.id);
  }

  // Create a dashboard.
  scorecardDashboard = new google.visualization.Dashboard(document.getElementById('scorecard_dashboard_div'));

  // Create a range slider, passing some options
  scoreCardRangeSelector = new google.visualization.ControlWrapper({
    controlType: "ChartRangeFilter",
    containerId: "scorecard_filter_div",
    options: {
      filterColumnIndex: 0,
      ui: { chartOptions: {legend: {position: "top" },height: 50, chartArea: {width: '90%'}}}    }
  });

  // Create the Chart Wrapper
  scorecardChart = new google.visualization.ChartWrapper({
    chartType: 'ColumnChart',
    containerId: 'scorecard_chart_div',
    options: {legend: {position: "top"},
      chartArea: {width: "90%"},
    }

  });

  // Bind the both with Dashboard
  scorecardDashboard.bind(scoreCardRangeSelector, scorecardChart);

  // Draw it
  scorecardDashboard.draw(scorecardChartData);

}

这是我刷新图形数据的方式:

refreshData function(){


    var rows = [];

   //NORMALLY HERE THERE WILL BE AN AJAX REQUEST TO GET DATA FROM SERVER

    var items = jsonData.driverScorecardItems;

    for (var i = 0; i < items.length; i++) {

      var item = items[i];

      // 
      var thisRow = [{
        v: new Date(item.dateFormatted),
        f: item.dateFormatted
      }, {
        v: item.harshBrakings
      }, {
        v: item.distanceTravelledKM
      }];


      rows.push(thisRow);
    }

    // Add the rows to my Data Table
    scorecardChartData.addRows(rows);

    // Redraw the Chart
    scorecardDashboard.draw(scorecardChartData);

}

【问题讨论】:

    标签: charts google-visualization


    【解决方案1】:

    看起来你偶然发现了某种错误...

    从小提琴中取出代码,在进行以下修改后一切正常...

    加载时只需从'packages' 中删除'corechart'...

    之前

    google.charts.load('current', {
      'packages': ['corechart', 'controls']  // <-- remove 'corechart' 
    });
    

    之后

    google.charts.load('current', {
      'packages': ['controls']
    });
    

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

    var scorecardChartData;
    var scorecardChart;
    var scorecardTable;
    var scorecardDashboard;
    var scoreCardRangeSelector;
    
    var scorecardChartOptions = {
      legend: {
        position: "top"
      },
      chartArea: {
        width: "90%"
      },
      xptColumns: [{
        id: "dateid",
        label: "Date",
        type: "date"
      }, {
        id: "brakingid",
        label: "Brakings",
        type: "number"
      }, {
        id: "distanceTravelledid",
        label: "Distance Travelled",
        type: "number"
      }, ]
    };
    
    google.charts.load('current', {
      'packages': ['controls']
    });
    google.charts.setOnLoadCallback(initViolationChart);
    
    function initViolationChart() {
      scorecardChartData = new google.visualization.DataTable();
    
      for (let i = 0; i < scorecardChartOptions.xptColumns.length; i++) {
        var column = scorecardChartOptions.xptColumns[i];
        scorecardChartData.addColumn(column.type, column.label, column.id);
      }
    
      // Create a dashboard.
      scorecardDashboard = new google.visualization.Dashboard(document.getElementById('scorecard_dashboard_div'));
    
      // Create a range slider, passing some options
      scoreCardRangeSelector = new google.visualization.ControlWrapper({
        controlType: "ChartRangeFilter",
        containerId: "scorecard_filter_div",
        options: {
          filterColumnIndex: 0,
          ui: {
            chartOptions: {
              legend: {
                position: "top"
              },
              height: 50,
              chartArea: {
                width: '90%'
              }
            }
          }
        }
      });
    
      scorecardChart = new google.visualization.ChartWrapper({
        chartType: 'ColumnChart',
        containerId: 'scorecard_chart_div',
        options: {
          legend: {
            position: "top"
          },
          chartArea: {
            width: "90%"
          },
        }
    
      });
    
      scorecardDashboard.bind(scoreCardRangeSelector, scorecardChart);
      scorecardDashboard.draw(scorecardChartData);
    }
    
    var jsonData = {
    
      driverScorecardItems: [{
        "scoreDate": "2017-02-15T00:00:00",
        "dateFormatted": "15-Feb-2017",
        "harshBrakings": 0,
        "distanceTravelledKM": 15.7286863,
    
      }, {
        "scoreDate": "2017-02-16T00:00:00",
        "dateFormatted": "16-Feb-2017",
        "harshBrakings": 0,
        "distanceTravelledKM": 23.1175938,
    
      }, {
        "scoreDate": "2017-02-17T00:00:00",
        "dateFormatted": "17-Feb-2017",
        "distanceTravelledKM": 49.20245,
    
      }, {
        "scoreDate": "2017-02-18T00:00:00",
        "dateFormatted": "18-Feb-2017",
        "harshBrakings": 0,
        "distanceTravelledKM": 13.8180962,
    
      }, {
        "scoreDate": "2017-02-19T00:00:00",
        "dateFormatted": "19-Feb-2017",
        "harshBrakings": 0,
        "distanceTravelledKM": 61.5765,
    
      }, {
        "scoreDate": "2017-02-20T00:00:00",
        "dateFormatted": "20-Feb-2017",
        "harshBrakings": 0,
        "distanceTravelledKM": 5.134261,
    
      }]
    }
    
    $(function() {
      $('#refreshChart').click(function() {
        var rows = [];
        var items = jsonData.driverScorecardItems;
    
        for (var i = 0; i < items.length; i++) {
    
          var item = items[i];
    
          var thisRow = [{
            v: new Date(item.dateFormatted),
            f: item.dateFormatted
          }, {
            v: item.harshBrakings
          }, {
            v: item.distanceTravelledKM
          }];
          rows.push(thisRow);
        }
    
        scorecardChartData.addRows(rows);
        scorecardDashboard.draw(scorecardChartData);
      });
    });
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
    <script src="https://www.gstatic.com/charts/loader.js"></script>
    
    <button id="refreshChart">
      Refresh
    </button>
    
    <!--Div that will hold the dashboard-->
    <div id="scorecard_dashboard_div" class="row">
      <!--Divs that will hold each control and chart-->
      <div id="scorecard_chart_div"></div>
      <div id="scorecard_filter_div"></div>
      <div id="scorecard_table_div"></div>
    </div>

    注意:

    driverScorecardItems 数组中的第三项缺少 --> "harshBrakings" 的属性

    var jsonData = {
    
      driverScorecardItems: [{
        "scoreDate": "2017-02-15T00:00:00",
        "dateFormatted": "15-Feb-2017",
        "harshBrakings": 0,
        "distanceTravelledKM": 15.7286863,
    
      }, {
        "scoreDate": "2017-02-16T00:00:00",
        "dateFormatted": "16-Feb-2017",
        "harshBrakings": 0,
        "distanceTravelledKM": 23.1175938,
    
      }, {
        "scoreDate": "2017-02-17T00:00:00",
        "dateFormatted": "17-Feb-2017",
        "distanceTravelledKM": 49.20245,
    
      }, {
      ...
    

    【讨论】:

    • 你是对的,它会起作用 - 但我使用的是 LineChart 和 ColumnChart 控件 - 如果我删除“corechart”,我会收到错误,因为它似乎找不到 ColumnCharts 和 LineCharts
    • 但我发现,如果我在用新数据刷新之前重新初始化仪表板、控制包装器和数据,它可以工作 - 我已经发布了我的解决方法作为答案
    【解决方案2】:

    我的工作 -

    如果我在刷新数据/图表时调用 initViolationChart() 函数,一切似乎都正常。

    所以我将刷新功能更改如下:

      $('#refreshChart').click(function() {
    
        // HERE - I re-initalise the chart dashboard. And then it works
        initViolationChart()
    
        var rows = [];
        var items = jsonData.driverScorecardItems;
    
        for (var i = 0; i < items.length; i++) {
    
          var item = items[i];
    
          var thisRow = [{
            v: new Date(item.dateFormatted),
            f: item.dateFormatted
          }, {
            v: item.harshBrakings
          }, {
            v: item.distanceTravelledKM
          }];
          rows.push(thisRow);
        }
    
        scorecardChartData.addRows(rows);
        scorecardDashboard.draw(scorecardChartData);
    
    
      });
    

    工作小提琴:https://jsfiddle.net/40ta8xvu/

    【讨论】:

      猜你喜欢
      • 2016-09-11
      • 1970-01-01
      • 2015-12-22
      • 1970-01-01
      • 1970-01-01
      • 2016-11-04
      • 1970-01-01
      • 1970-01-01
      • 2018-03-05
      相关资源
      最近更新 更多