【问题标题】:javascript - for loop to generate charts (amchart)javascript - 用于生成图表的 for 循环 (amchart)
【发布时间】:2015-08-29 21:15:11
【问题描述】:

我正在尝试使用下面的代码一次生成多个折线图。但是,它不起作用。使用 for/while 或任何其他循环机制生成图形的最佳方法是什么?我有很多图表要生成。

   var db_query = Array();
    db_query[1] = <?php echo json_encode($db_query_1) ?>;
    db_query[2] = <?php echo json_encode($db_query_2) ?>;

    var chartConfig1 = clone(chartConfigLineOne);
    var chartConfig2 = clone(chartConfigLineOne);

    for(var i=1, len=2; i <= len; i++) {
        /* chart initialization */
        var chart_num = "chart" + i.toString();
        var plot_num =  "plot" + i.toString();
        var chartConfig_num = "chartConfig" + i.toString();
        /*alert(chart_num);
        alert(plot_num);
        alert(chartConfig_num);*/
        chart_num = AmCharts.makeChart(plot_num, chartConfig_num);

        $.ajax({
            type: 'POST',
            url: "query_db.php",
            data: {'db_que': db_query[i]},
            dataType: 'json',
            context: document.body,
            global: false,
            async:  true,
            success: function(data) {
                //alert(data);
                chart_num.dataProvider = data;
                chart_num.validateNow();
            }
        });
    }

更新代码

        <script type="text/javascript">

            var chartNameList = ['chart1','chart2'];
            var divId = ['plot1','plot2'];
            var configList = ['chartConfig1','chartConfig2'];
            var dbQuery = [];

            var chartConfig1 = clone(chartConfigLineOne);
            var chartConfig2 = clone(chartConfigLineOne);

             dbQuery[0] = <?php echo json_encode($db_query_1) ?>;
             dbQuery[1] = <?php echo json_encode($db_query_2) ?>;

            /* chart initialization */
            for(var i =0; i < 2; i += 1)   {
                //window["chart"+i] = createChartObj(divId[i],configList[i]);
                execDbQuery(divId[i],configList[i],dbQuery[i],chartNameList[i]);
            }
        </script>

/**
 * Execute of DB query
 */

function execDbQuery(divId, configObj, dbQuery, chartObj) {
    chartObj = AmCharts.makeChart(divId, configObj);
    $.ajax({
        type: 'POST',
        url: "query_db.php",
        data: {'db_que': dbQuery},
        dataType: 'json',
        context: document.body,
        global: false,
        async:  true,
        success: function(data) {
            //alert(data);
            chartObj.dataProvider = data;
            chartObj.validateNow();
        }
    });
} 

【问题讨论】:

  • 不要将JavaScriptPHP 混用,例如db_query[1] = &lt;?php echo json_encode($db_query_1) ?&gt;;。这太可怕了。并且尽量不要使用多个var a; var b; var c;,而是只使用var a = 123, b = 345, ...。如果你不改变你的编程风格,总有一天你的代码会看起来像意大利面条。
  • 而不是警报,如alert(data) 使用console.log(data)。您正在编程的风格在几年前已经过时了。所以,你最好在JavaScript阅读一些专业编程方面的书籍。
  • 你好 Jacobian - 谢谢你的指示。我是编程新手。这绝对是一个陡峭的学习曲线。我可以请求您的帮助以了解如何做我想要实现的目标吗?另外,如果您能快速向我介绍如何在 javascript 中访问 PHP 数据或其他方式,那将非常有帮助
  • 您已经知道如何访问Javascript 中的PHP 数据。这实际上是 ajax 在您的示例中所做的。
  • 退后一步,我有一个用户选择值的主页。然后单击提交后,这些值将发布到动态构造 SQL 的 PHP 页面(接收数据和构建 SQL 查询发生在 部分之间。在本节之后,我有一个 javascript 部分在里面我有ajax代码。所以,要访问PHP代码中内置的SQL,我正在使用db_query[1] = 你能建议一种不同的方式吗?

标签: javascript jquery ajax amcharts


【解决方案1】:

正如许多 cmets 正确指出的那样,您可能应该从重新考虑您的数据加载方法开始。从客户端传入 SQL 查询是自找麻烦。您能否正确清理查询以防范恶意代码?你不能确定。

将数据库访问层移至 PHP 更为合理。您可以传入在服务器上运行的 PHP 脚本所需的参数,以识别需要从数据库加载的内容并构建和执行实际的 SQL 查询。

即:query_db.php?chart_id=5

由 PHP 脚本决定要做什么。鉴于您目前正在使用 PHP 来格式化这些 SQL 查询,我几乎无法想象这可能是个问题。

这给我们带来了另一个问题。您当前的设置将同时运行多个 AJAX 请求。虽然在您发布的包含两个图表的示例中可能没问题,但如果您有 30 个需要为其加载数据的图表,它可能会降低性能。

解决方案是菊花链式加载。不要开始加载另一个图表,直到前一个图表完成加载。即:

var charts = [ {
  "name": "chart1",
  "div": "plot1",
  "config": clone( chartConfigLineOne ),
  "query": <? php echo json_encode( $db_query_1 ) ?>
}, {
  "name": "chart2",
  "div": "plot2",
  "config": clone( chartConfigLineOne ),
  "query": <? php echo json_encode( $db_query_2 ) ?>
} ];

// do whatever modifications to each chart's config you need here
// ...

// function that creates the chart
function processNextChart() {
  if ( charts.length ) {
    var chart = charts.shift();
    $.ajax( {
      type: 'POST',
      url: "query_db.php",
      data: {
        'db_que': chart.query
      },
      dataType: 'json',
      context: document.body,
      global: false,
      async: true,
      success: function( data ) {
        chart.config.dataProvider = data;
        chartObj = AmCharts.makeChart( chart.div, chart.config );
        setTimeout( processNextChart, 100 );
      }
    } );
  }
}

// process first chart
processNextChart();

请注意我是如何用一个包含所有适用数据的数组来简化整个图表数组的。

请注意,上述代码未经现场测试,仅作为您自己实施的指导点。

【讨论】:

  • 非常感谢马丁。我非常感谢您的帮助。我正在学习一种全新的做事方式。这次真是万分感谢。关于传递 SQL 查询,我不会将它们从客户端/浏览器传递给 PHP。我只传递诸如日期范围和选择的选项之类的东西并将其发布到构建 SQL 并通过 ajax 执行它并绘制图表的 PHP。澄清一下,如果我做了“查看页面源代码”或使用了诸如 firebug 之类的工具,我将看不到任何 SQL。我会参考你的例子和实施。很快就会告诉你我的进展情况。
  • 当然。刚刚对代码做了一些更新。 (注意到一个错误)
  • 您好 Martyn - 请您接受“编辑”。为了保持一致性,我更改了 sql 查询名称。
  • 我还没来得及写它就被其他编辑拒绝了。所以我自己也做了同样的修改。
  • 谢谢马丁。除此之外,我还设法创建了 3 层层次结构。一个接受用户输入的层,一个 PHP 接收用户输入并对 PHP 构建 SQL 的另一个层进行 ajax 调用的层,执行并将一个 JSON 数组返回到绘制图形的第 2 层。这听起来是一种更好/更好的做事方式吗?
【解决方案2】:

不要在for 循环内调用ajax。这是服务器的负担。您拨打的电话越少,您的ui 的响应速度就越快。因此,实现您想要的更好的方法是在一个 ajax 调用中获取所有图形的所有数据,然后在 success 上迭代使用 AmCharts.makeChart 构建图形的数据。

【讨论】:

  • 我很乐意按照您的建议来实现它。不幸的是,SQL 查询都是不同的(它们返回不同数量的列)。这就是为什么我在循环之后:-(
  • 将此数据库逻辑移至服务器端。
  • 我的意思是我有一堆 SQL 查询,我一个接一个地执行并为每个查询结果绘制图表。 SQL 输出具有不同的列数。例如,Date、COUNT(A) 作为第一个 SQL 的输出,DATE、COUNT(C) 用于第二个,DATE、NAME、COUNT(F) 用于第三个以及更多组合。
  • 我知道这与问题无关。但我就是不能忽视用户:gerric 愿意帮助 User12345。看到这么好的编码社区真的很棒。 Gerric 开始在这个帖子中帮助他,stackoverflow.com/questions/32256442/… 我跟着兔子洞一直到这里.. 太棒了
猜你喜欢
  • 1970-01-01
  • 2013-12-16
  • 2011-10-25
  • 1970-01-01
  • 2021-07-15
  • 2017-10-25
  • 2020-05-19
  • 1970-01-01
  • 2020-04-14
相关资源
最近更新 更多