简体   繁体   English

如何使用 Google Charts API 绘制两个材质图表而一个不为空?

[英]How can I draw two material charts with the Google Charts API without one being empty?

I'm trying to draw two charts using the Google Charts API.我正在尝试使用 Google Charts API 绘制两个图表。 I set up my HTML like this:我这样设置我的 HTML:

<div id="page_views" data-title="{{ report['page_views']['title'] }}" data-labels="{{ report['page_views']['labels'] }}" data-rows="{{ report['page_views']['rows'] }}"></div>
<div id="event_views" data-title="{{ report['event_views']['title'] }}" data-labels="{{ report['event_views']['labels'] }}" data-rows="{{ report['event_views']['rows'] }}"></div>

where the data attributes are filled during template rendering.在模板渲染期间填充数据属性的位置。 I then use the following javascript to attempt to draw my charts:然后我使用以下 javascript 尝试绘制我的图表:

google.load('visualization', '1.0', {packages: ['line']});
google.setOnLoadCallback(drawCharts);

function drawPageViews() {
    var data = new google.visualization.DataTable();
    var page_views = document.getElementById("page_views");
    var labels = eval(page_views.dataset.labels);
    data.addColumn('number', "Day");
    for(var i = 0; i < labels.length; i++) {
        data.addColumn('number', labels[i]);
    }

    var rows = eval(page_views.dataset.rows);
    data.addRows(rows);

    var options = {
        chart: {
            title: page_views.dataset.title
        },
        width: 900,
        height: 500
    };

    var chart = new google.charts.Line(document.getElementById('page_views'));
    chart.draw(data, options);
}

function drawEventViews() {
    var data = new google.visualization.DataTable();
    var event_views = document.getElementById("event_views");
    var labels = eval(event_views.dataset.labels);
    data.addColumn('number', "Day");
    for(var i = 0; i < labels.length; i++) {
        data.addColumn('number', labels[i]);
    }

    var rows = eval(event_views.dataset.rows);
    data.addRows(rows);

    var options = {
        chart: {
            title: event_views.dataset.title
        },
        width: 900,
        height: 500
    };

    var chart = new google.charts.Line(document.getElementById('event_views'));
    chart.draw(data, options);
}

function drawCharts() {
    drawPageViews();
    drawEventViews();
}

The result that I get is that one of the charts is drawn while the other contains an SVG with an empty tag and nothing else inside.我得到的结果是绘制了一个图表,而另一个包含一个带有空标签的 SVG,里面没有其他东西。 Which chart gets drawn is random.绘制哪个图表是随机的。 Commenting out either draw function makes the other single chart draw as expected.注释掉任一绘制函数会使其他单个图表按预期绘制。

It seems like there must be some sort of shared global state or variable but it looks to me like everything is defined in the different draw functions.似乎必须有某种共享的全局状态或变量,但在我看来,一切都在不同的绘制函数中定义。 When I look up similar questions people offer solutions which look very much like what I'm doing.当我查找类似的问题时,人们会提供与我正在做的事情非常相似的解决方案。 What am I missing?我错过了什么?

It seems this behavior is related with draw function, in particular it occurs once multiple charts is rendered on the page.这种行为似乎与draw功能有关,尤其是在页面上呈现多个图表时会发生这种情况。

According to the documentation :根据文档

The draw() method is asynchronous: that is, it returns immediately, but the instance that it returns might not be immediately available. draw() 方法是异步的:也就是说,它立即返回,但它返回的实例可能不会立即可用。

For rendering multiple charts on the page you could consider the following approach: render the next chart once the previous one is rendered, this is where ready event comes to the rescue.要在页面上渲染多个图表,您可以考虑以下方法:在渲染上一个图表后渲染下一个图表,这就是ready事件可以派上用场的地方。

Having said that the solution would be to replace:话虽如此,解决方案是替换:

function drawCharts() {
  drawPageViews();
  drawEventViews();
}

with

function drawCharts() {
    drawPageViews(function(){
       drawEventViews();
    });
}

where在哪里

function drawPageViews(chartReady) {
    //...
    var chart = new google.charts.Line(document.getElementById('page_views'));
    if (typeof chartReady !== 'undefined') google.visualization.events.addOneTimeListener(chart, 'ready', chartReady);
    chart.draw(data, options);
}

and

function drawEventViews(chartReady) {
    //...
    var chart = new google.charts.Line(document.getElementById('event_views'));
    if (typeof chartReady !== 'undefined') google.visualization.events.addOneTimeListener(chart, 'ready', chartReady);
    chart.draw(data, options);
}

Working example工作示例

 google.load('visualization', '1.0', { packages: ['line'] }); google.setOnLoadCallback(drawCharts); function drawPageViews(chartReady) { var data = new google.visualization.DataTable(); var page_views = document.getElementById("page_views"); var labels = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']; data.addColumn('string', 'Day'); data.addColumn('number', 'PageViews'); var rows = new Array(); for (var i = 0; i < labels.length; i++) { rows.push([labels[i], getRandomInt(0, 100)]); } data.addRows(rows); var options = { chart: { title: 'Page views' }, width: 900, height: 500 }; var chart = new google.charts.Line(document.getElementById('page_views')); if(typeof chartReady !== 'undefined') google.visualization.events.addOneTimeListener(chart, 'ready', chartReady); chart.draw(data, options); } function drawEventViews(chartReady) { var data = new google.visualization.DataTable(); var event_views = document.getElementById("event_views"); var labels = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']; data.addColumn('string', 'Day'); data.addColumn('number', 'EventViews'); var rows = new Array(); for (var i = 0; i < labels.length; i++) { rows.push([labels[i], getRandomInt(0, 100)]); } data.addRows(rows); var options = { chart: { title: 'Event views' }, width: 900, height: 500 }; var chart = new google.charts.Line(document.getElementById('event_views')); if(typeof chartReady !== 'undefined') google.visualization.events.addOneTimeListener(chart, 'ready', chartReady); chart.draw(data, options); } function drawCharts() { drawPageViews(function(){ drawEventViews(); }); } function getRandomInt(min, max) { return Math.floor(Math.random() * (max - min + 1)) + min; }
 <script type="text/javascript" src="https://www.google.com/jsapi"></script> <div id="page_views"></div> <div id="event_views"></div>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM