【问题标题】:Google charts into JQuery Tab draw issue谷歌图表进入 JQuery Tab 绘制问题
【发布时间】:2016-06-22 09:49:34
【问题描述】:

我目前正在尝试移动通过 socket.io 从服务器端提取数据并将其绘制到 JQuery UI 选项卡中的 Google 图表。

遇到的问题是第一个绘制的报告工作正常并且看起来很好。

第二个看起来很错误,我认为这可能与绘制表格的方式有关,但无法找到解决方案,当我只是将其绘制到 JQuery UI 选项卡之外的 div 中时,不会发生此问题。

这是我现在拥有的当前代码:

jQuery(function ($) {
    var socket = io.connect();
    var result = [];
    google.charts.load('current', {
            packages : ['bar']
        });

 $(function() {
    $( "#tabs" ).tabs();
  });

    socket.on("SQLdipo", function (valueArr) {
        google.charts.setOnLoadCallback(drawMaterial);
        var data = valueArr;
        function drawMaterial() {

            var result = [['Call Disposition', 'Answered', 'No Answer', 'Busy','Failed']].concat(valueArr);
            var options = {
                height: 350,
                 chart: {
            title: 'Agent Call Dispositions',
            subtitle: 'Agent call states',
          }
            };
            var chartdata = new google.visualization.arrayToDataTable(result);
            var chart1 = new google.charts.Bar(document.getElementById('chartDipo'));
            chart1.draw(chartdata, options);
        }
    });

    socket.on("SQLmins", function (valueArr) {
        google.charts.setOnLoadCallback(drawChart);
        var data = valueArr;
        function drawChart() {

            var result = [['Total Mins', 'Active','Inactive']].concat(valueArr);
            var options = {
                height: 350,
                 chart: {
            title: 'Agent Activity in seconds',
            subtitle: 'Agent Duration Activity',
          }
            };
            var chartdata = new google.visualization.arrayToDataTable(result);
            var chart2 = new google.charts.Bar(document.getElementById('chartMins'));
            chart2.draw(chartdata, options);
        }
    });
});

我已经配置了一个 JS fiddle 来模拟 HERE 遇到的问题

【问题讨论】:

    标签: javascript jquery jquery-ui socket.io google-visualization


    【解决方案1】:

    问题是图表在最初绘制时是隐藏的。
    您可以设置特定的尺寸选项...

    等到选项卡被激活,在第一次绘制图表之前,如本例中...

    $(document).ready(function() {
      $("#tabs").tabs({
        activate: function(event, ui){
          switch (ui.newTab.index()) {
            case 0:
              drawMaterial();
              break;
    
            case 1:
              drawChart();
              break;
          }
        }
      });
    
      google.charts.load('current', {
        callback: drawMaterial,
        packages: ['bar']
      });
    
      function drawMaterial() {
        var data = google.visualization.arrayToDataTable([
          ['Call Disposition', 'Answered', 'No Answer', 'Busy', 'Failed'],
          ['1000', 4, 0, 2, 0],
          ['1001', 4, 2, 0, 0],
          ['1002', 6, 0, 0, 0]
        ]);
    
        var options = {
          height: 350,
          chart: {
            title: 'Agent Call Dispositions',
            subtitle: 'Agent call states',
          }
        };
        var chart1 = new google.charts.Bar(document.getElementById('chartDipo'));
        chart1.draw(data, options);
      }
    
      function drawChart() {
        var data = google.visualization.arrayToDataTable([
          ['Call Disposition', 'Answered', 'No Answer', 'Busy', 'Failed'],
          ['1000', 4, 0, 2, 0],
          ['1001', 4, 2, 0, 0],
          ['1002', 6, 0, 0, 0]
        ]);
    
        var options = {
          height: 350,
          chart: {
            title: 'Agent Call Dispositions',
            subtitle: 'Agent call states',
          }
        };
        var chart1 = new google.charts.Bar(document.getElementById('chartMins'));
        chart1.draw(data, options);
      }
    });
    <link rel="stylesheet" type="text/css" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/themes/smoothness/jquery-ui.css"/>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script>
    <script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js"></script>
    <script src="https://www.gstatic.com/charts/loader.js"></script>
    <div class="tab-div" id="tabs">
      <ul>
        <li><a href="#tabs-1">Call Disposition</a></li>
        <li><a href="#tabs-2">Agent Activity</a></li>
      </ul>
      <div id="tabs-1">
        <div class="report-style" id="chartDipo"></div>
      </div>
      <div id="tabs-2">
        <div class="report-style" id="chartMins"></div>
      </div>
    </div>

    【讨论】:

    • 遇到的问题是,当我在上面的代码中添加 socket.io 以使用您建议的解决方案时,我无法访问这些功能。
    • Socket.on?当任何东西从服务器端传递给它时,它就会运行代码和包含在其中的所有内容。你是这个意思吗?是的,我试过了,但我会仔细检查
    • 抱歉,当您说 我无法访问这些功能 时——您的意思是 drawMaterialdrawChart 吗?不熟悉socket.io...
    • 尝试增加宽度,但它什么也没做,是的,我无法访问这些功能 drawMaterialdrawChart 因为上面的 socket.io
    • 根据你给我的例子,我确实有一个解决方法,但这意味着我从服务器端提取信息并将其粘贴到全局变量中,我知道不建议这样做如果您希望我发表建议?
    【解决方案2】:

    我已经根据你给@Whitehat 的建议用我自己的代码修改了它,它工作正常,但这意味着我必须使用我认为不推荐的全局变量。

    您对此有何想法或任何建议的更改或改进?

    jQuery(function ($) {
        //Global Varibles
        var socket = io.connect();
        var result = [];
        google.charts.load('current', {
                packages : ['bar']
            });
    
    $("#tabs").tabs({
        activate: function(event, ui){
          switch (ui.newTab.index()) {
            case 0:
              drawMaterial();
              break;
    
            case 1:
              drawChart();
              break;
          }
        }
      });
    
        socket.on("SQLdipo", function (valueArr) {
            google.charts.setOnLoadCallback(drawMaterial);
            data1 = valueArr;
        });
    
        socket.on("SQLmins", function (valueArr) {
            google.charts.setOnLoadCallback(drawChart);
            data2 = valueArr;
        });
    
    
            function drawMaterial() {
    
                var result = [['Call Disposition', 'Answered', 'No Answer', 'Busy','Failed']].concat(data1);
                var options = {
                    height: 350,
                     chart: {
                title: 'Agent Call Dispositions',
                subtitle: 'Agent call states',
              }
                };
                var chartdata = new google.visualization.arrayToDataTable(result);
                var chart1 = new google.charts.Bar(document.getElementById('chartDipo'));
                chart1.draw(chartdata, options);
            }
    
            function drawChart() {
    
                var result = [['Total Mins', 'Active','Inactive']].concat(data2);
                var options = {
                    height: 350,
                     chart: {
                title: 'Agent Activity in seconds',
                subtitle: 'Agent Duration Activity',
              }
                };
                var chartdata = new google.visualization.arrayToDataTable(result);
                var chart2 = new google.charts.Bar(document.getElementById('chartMins'));
                chart2.draw(chartdata, options);
            }
    
    });
    

    【讨论】:

    • 我现在明白了,谢谢。这很难——而且你必须等待setOnLoadCallback,因为页面会重新加载?
    • 我想是的,它不是一个理想的解决方案,但现在它有效,所以我会将您的回复标记为答案
    猜你喜欢
    • 1970-01-01
    • 2018-06-08
    • 2011-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多