amcharts ไม่สามารถใช้สองแผนภูมิในหน้าเดียวกันได้

ฉันใช้ amcharts "แผนภูมิวงกลมที่มีส่วนย่อย" (https://www.amcharts.com/demos/pie-chart-broken-slices/)

เมื่อฉันเพิ่มสองแผนภูมิ ฉันไม่ได้ทำให้เกิดปัญหา ปัญหาเกิดขึ้นเมื่อฉันคลิกในแผนภูมิแรก แผนภูมินี้ถูกแทนที่ด้วยแผนภูมิที่สอง และตอนนี้ฉันมี 2 แผนภูมิที่มีข้อมูลของแผนภูมิที่สอง

ซอร์สโค้ดของแผนภูมิแรก:

<div id="chartdevicesdiv" style="width: 100%; height: 500px"></div>

<script>
var chart;
var legend;
var selected;

var types = [{
  type: "Smartphone",
  percent: 45,
  total: 150,
  color: "#71c66b",
  subs: [{
    type: "iOS",
    percent: 15
  }, {
    type: "Android",
    percent: 35
  }, {
    type: "Other",
    percent: 20
  }]
}, {
  type: "Tablet",
  percent: 15,
  total: 30,
  color: "#f2a013",
  subs: [{
    type: "iOS",
    percent: 15
  }, {
    type: "Android",
    percent: 10
  }, {
    type: "Other",
    percent: 5
  }]
},
 {
  type: "Desktop",
  percent: 40,
  total: 75,
  color: "#4f98f7",
  subs: [{
    type: "Windows",
    percent: 15
  }, {
    type: "Mac",
    percent: 10
  }, {
    type: "Linux",
    percent: 5
  }]
}];

function generateChartData() {
  var chartData = [];
  for (var i = 0; i < types.length; i++) {
    if (i == selected) {
      for (var x = 0; x < types[i].subs.length; x++) {
        chartData.push({
          type: types[i].subs[x].type,
          percent: types[i].subs[x].percent,
          color: types[i].color,
          pulled: true
        });
      }
    } else {
      chartData.push({
        type: types[i].type,
        percent: types[i].percent,
        color: types[i].color,
        id: i
      });
    }
  }
  return chartData;
}

AmCharts.makeChart("chartdevicesdiv", {
  "type": "pie",
"theme": "light",

  "dataProvider": generateChartData(),
  "labelText": "[[title]]: [[value]]%",
  "balloonText": "[[title]]: [[value]]%",
  "titleField": "type",
  "valueField": "percent",
  "outlineColor": "#FFFFFF",
  "outlineAlpha": 0.8,
  "outlineThickness": 2,
  "colorField": "color",
  "pulledField": "pulled",
  "titles": [{
    "text": "Devices stats"
  }],
  "listeners": [{
    "event": "clickSlice",
    "method": function(event) {
      var chart = event.chart;
      if (event.dataItem.dataContext.id != undefined) {
        selected = event.dataItem.dataContext.id;
      } else {
        selected = undefined;
      }
      chart.dataProvider = generateChartData();
      chart.validateData();
    }
  }],
  "export": {
    "enabled": true
  }
});
</script>

และที่นี่ ในหน้าเดียวกัน แหล่งที่มาของแผนภูมิที่สอง

<div id="chartsourcesdiv" style="width: 100%; height: 500px"></div>

<script>
var chart;
var legend;
var selected;

var types = [{
  type: "tself",
  percent: 70,
  color: "#267be2",
}, {
  type: "widget",
  percent: 30,
  color: "#aa9cb7",
}];

function generateChartData() {
  var chartData = [];
  for (var i = 0; i < types.length; i++) {
    if (i == selected) {
      for (var x = 0; x < types[i].subs.length; x++) {
        chartData.push({
          type: types[i].subs[x].type,
          percent: types[i].subs[x].percent,
          color: types[i].color,
          pulled: true
        });
      }
    } else {
      chartData.push({
        type: types[i].type,
        percent: types[i].percent,
        color: types[i].color,
        id: i
      });
    }
  }
  return chartData;
}

AmCharts.makeChart("chartsourcesdiv", {
  "type": "pie",
"theme": "light",

  "dataProvider": generateChartData(),
  "labelText": "[[title]]: [[value]]%",
  "balloonText": "[[title]]: [[value]]%",
  "titleField": "type",
  "valueField": "percent",
  "outlineColor": "#FFFFFF",
  "outlineAlpha": 0.8,
  "outlineThickness": 2,
  "colorField": "color",
  "pulledField": "pulled",
  "titles": [{
    "text": "Sources"
  }],
  "listeners": [{
    "event": "clickSlice",
    "method": function(event) {
      var chart = event.chart;
      if (event.dataItem.dataContext.id != undefined) {
        selected = event.dataItem.dataContext.id;
      } else {
        selected = undefined;
      }
      chart.dataProvider = generateChartData();
      chart.validateData();
    }
  }],
  "export": {
    "enabled": true
  }
});
</script>

person MGE    schedule 27.01.2017    source แหล่งที่มา


คำตอบ (1)


ปัญหาคือคุณกำลังใช้ชื่อตัวแปรเดียวกันสำหรับข้อมูลของแผนภูมิทั้งสอง เมื่อคุณประกาศตัวแปร types อีกครั้ง คุณจะเขียนทับการประกาศครั้งก่อน ดังนั้นการคลิกใดๆ ก็ตามจะใช้ข้อมูลของตัวแปร types ตัวที่สอง วิธีที่สะอาดตาในการแก้ไขปัญหานี้คือการเปลี่ยนตัวแปรประเภทให้มีชื่อที่ไม่ซ้ำกัน จากนั้นแก้ไขฟังก์ชัน generateChartData ของคุณ (คุณต้องการเพียงอันเดียวเท่านั้นเนื่องจากทั้งคู่ทำสิ่งเดียวกัน) เพื่อรับพารามิเตอร์

var chart1types = [ /* data */ ];
var chart2types = [ /* data */ ];

function generateChartData(types) {
  //same code from before
}

AmCharts.makeChart("chartdevicesdiv", {
  // ...
  "dataProvider": generateChartData(chart1types), //use first types variable
  // ...
  "listeners": [{
    "event": "clickSlice",
    "method": function(event) {
      var chart = event.chart;
      if (event.dataItem.dataContext.id != undefined) {
        selected = event.dataItem.dataContext.id;
      } else {
        selected = undefined;
      }
      chart.dataProvider = generateChartData(chart1types); //use first types variable
      chart.validateData();
    }
  }],
  // ...
});


AmCharts.makeChart("chartsourcesdiv", {
  // ...
  "dataProvider": generateChartData(chart2types), //use second types variable
  // ...
  "listeners": [{
    "event": "clickSlice",
    "method": function(event) {
      var chart = event.chart;
      if (event.dataItem.dataContext.id != undefined) {
        selected = event.dataItem.dataContext.id;
      } else {
        selected = undefined;
      }
      chart.dataProvider = generateChartData(chart2types); //use second types variable
      chart.validateData();
    }
  }],
  // ...
});

นี่คือการสาธิตของการแก้ไข

person xorspark    schedule 27.01.2017
comment
คุณยังเปลี่ยนฟังก์ชัน GenerateChartData เพื่อรับพารามิเตอร์และเปลี่ยนโค้ดของคุณให้ส่งผ่านเหมือนที่ฉันเขียนไว้ในโค้ดหรือไม่ อ่านคำตอบทั้งหมดของฉัน ดูโค้ดในการสาธิตของฉัน และตรวจสอบโค้ดของคุณอย่างละเอียด - person xorspark; 27.01.2017
comment
เพียงเปลี่ยนชื่อฟังก์ชันก็แก้ไขได้ ปัญหาคือกราฟแรกกำลังเรียกไปยังกราฟแรก แต่ละฟังก์ชันมีความแตกต่างกัน ฉันจึงต้องสร้างฟังก์ชันที่แยกจากกัน แต่เห็นได้ชัดว่ามีชื่อต่างกัน ขอบคุณ! - person MGE; 27.01.2017