【问题标题】:unable to overwrite the existing bar amchart with a new amchart based on dropdown selection无法根据下拉选择用新的 amchart 覆盖现有的 bar amchart
【发布时间】:2018-08-01 08:12:54
【问题描述】:

我正在根据当前财政年度(即 2018-2019 年)在单击按钮时填充 amcharts。 代码如下:

function populateChartsBarFY(requestUriFY) {
var chartDataResults2 = [];
var AmountCollectedFYBar = 0;
$.ajax({
    url: requestUriFY,
    type: "GET",
    async: false,
    headers: { "ACCEPT": "application/json;odata=verbose" },
    success: function (data) {
        var dataResults = data.d.results;
        var clr;
        for (i = 0; i < dataResults.length; i++) {
            var chartItems = dataResults[i];         
            var dist = chartItems.District;
            var MineralCategory = chartItems.MineralCategory;
            AmountCollectedFYBar = parseFloat(chartItems.LastMonthCollection);
            if (MineralCategory == "Major" ) {
                clr = "#67B7DC";                
            }
            else if (MineralCategory == "Minor" ) {
                clr = "#FDD302";        
            }
            else if (MineralCategory == "Others" ) {           
                clr = "#83B762";            
            }
            var flag = false;
            for (var j = 0; j < chartDataResults2.length; j++) {
                if (chartDataResults2[j].MineralCategory == MineralCategory) {
                    chartDataResults2[j].AmountCollected = (chartDataResults2[j].AmountCollected + AmountCollectedFYBar);
                    chartDataResults2[j].balloonTextField=( dist + "," + MineralCategory + "," + (chartDataResults2[j].AmountCollected));
                    flag = true;
                }
            }
            if (flag == false) {
                chartDataResults2.push({
                    States: dist,
                    MineralCategory : MineralCategory,
                    AmountCollected: AmountCollectedFYBar,
                    "color": clr,
                    balloonTextField: dist + "," + MineralCategory + "," + AmountCollectedFYBar,
                });
            }

            AmCharts.ready(function () {
                // SERIAL CHART
                AmCharts.makeChart("chartdivdistFY", {
               type: "serial",               
              dataProvider: chartDataResults2,
              categoryField: "MineralCategory",
              categoryAxis: {
              labelRotation: 90,
              gridPosition: "start",
             gridThickness: 0,
             },              
              graphs: [ {
            valueField: "AmountCollected",
             type: "column",
              fillAlphas: 0.8,                
                colorField: "color",
                balloonText :"[[balloonTextField]]",
               labelText : "[[value]]",          
                type : "column",
                lineAlpha :0,               
                fixedColumnWidth :25
           } ],
         chartCursor: {
         cursorPosition: "mouse"
         },
         valueAxis:
         {
             dashLength:5,
             title:"Collected Amount",
            gridThickness:0,
             axisAlpha:0,
         },
         }); 

            });// JavaScript source code
        } // for
    }, //success
}); //ajax  
AmountCollectedFYBar = 0;
} //populate charts

如果我从下拉列表中将当前年份选择值从“2018-2019”更改为“2015-2016”并将其传递给 requestUriFY,我的新图表不会被覆盖。

有人对此有解决方案吗?

【问题讨论】:

    标签: javascript ajax amcharts


    【解决方案1】:

    您的代码存在一些问题:

    1) AmCharts.ready 只是一个 window.onload/$(document).ready 赋值。它只在页面加载时运行AmCharts.ready 内的代码,因此再次调用它不会执行任何操作。将AmCharts.makeChart 呼叫移到AmCharts.ready 之外将解决部分问题。

    2) 您在 for 循环中创建与构建数据相同的图表,这根本没有意义。将AmCharts.makeChart 调用移到循环之外,这样它只会在您的数据完全分配给chartDataResults2 数组后调用一次。

    3) 您在同一个 div 中重新创建图表而不清除前一个实例,这将消耗更多资源,并且由于前一个图表实例试图重绘自身而导致视觉伪影。我建议将图表引用存储在全局中,并在首次加载时存储从AmCharts.makeChart 返回的图表对象,然后直接更新 dataProvider 并调用validateData() 以在从下拉列表中再次调用该函数时使用新数据重绘图表.

    下面的完整修复:

    var chart; //store the chart in a global that your populate function can refer to
    
    function populateChartsBarFY(requestUriFY) {
      var chartDataResults2 = [];
      var AmountCollectedFYBar = 0;
      $.ajax({
        url: requestUriFY,
        type: "GET",
        async: false,
        headers: {
          "ACCEPT": "application/json;odata=verbose"
        },
        success: function(data) {
          var dataResults = data.d.results;
          var clr;
          for (i = 0; i < dataResults.length; i++) {
            var chartItems = dataResults[i];
            var dist = chartItems.District;
            var MineralCategory = chartItems.MineralCategory;
            AmountCollectedFYBar = parseFloat(chartItems.LastMonthCollection);
            if (MineralCategory == "Major") {
              clr = "#67B7DC";
            } else if (MineralCategory == "Minor") {
              clr = "#FDD302";
            } else if (MineralCategory == "Others") {
              clr = "#83B762";
            }
            var flag = false;
            for (var j = 0; j < chartDataResults2.length; j++) {
              if (chartDataResults2[j].MineralCategory == MineralCategory) {
                chartDataResults2[j].AmountCollected = (chartDataResults2[j].AmountCollected + AmountCollectedFYBar);
                chartDataResults2[j].balloonTextField = (dist + "," + MineralCategory + "," + (chartDataResults2[j].AmountCollected));
                flag = true;
              }
            }
            if (flag == false) {
              chartDataResults2.push({
                States: dist,
                MineralCategory: MineralCategory,
                AmountCollected: AmountCollectedFYBar,
                "color": clr,
                balloonTextField: dist + "," + MineralCategory + "," + AmountCollectedFYBar,
              });
            } 
    
          } // for
    
          if (!chart) { //if the chart variable isn't defined, do the first makeChart call and store the reference
            // SERIAL CHART
            chart = AmCharts.makeChart("chartdivdistFY", {
              type: "serial",
              dataProvider: chartDataResults2,
              categoryField: "MineralCategory",
              categoryAxis: {
                labelRotation: 90,
                gridPosition: "start",
                gridThickness: 0,
              },
              graphs: [{
                valueField: "AmountCollected",
                type: "column",
                fillAlphas: 0.8,
                colorField: "color",
                balloonText: "[[balloonTextField]]",
                labelText: "[[value]]",
                type: "column",
                lineAlpha: 0,
                fixedColumnWidth: 25
              }],
              chartCursor: {
                cursorPosition: "mouse"
              },
              valueAxis: {
                dashLength: 5,
                title: "Collected Amount",
                gridThickness: 0,
                axisAlpha: 0,
              },
            });
          }
          else {
            //if the chart is defined, update the dataProvider with your new array and redraw with validateData:
            chart.dataProvider = chartDataResults2;
            chart.validateData()
          }
    
        }, //success
      }); //ajax  
      AmountCollectedFYBar = 0;
    } //populate charts
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-11
      • 2015-10-11
      • 1970-01-01
      • 1970-01-01
      • 2020-01-18
      • 1970-01-01
      相关资源
      最近更新 更多