You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AmCharts v3循环生成多Cardview图表加载异常问题

问题分析与解决方案

我一眼就揪出了几个关键问题,这正是导致你图表加载异常的核心原因:

1. DOM容器ID重复(最直接的问题)

你在循环里每次都调用AmCharts.makeChart("chartdiv", ...),但DOM中ID是唯一标识,三个图表都会往同一个chartdiv元素里渲染,最终只有最后一次循环的图表会保留(也就是下标[2]的数据),另外两个容器根本没被用到。

2. 循环变量的异步绑定问题

即使你改了ID,如果用var i声明循环变量,由于dataLoader是异步请求,当请求返回时,循环已经结束,i的值会固定为最后一个索引(2),导致所有图表都请求最后一个ID的数据。

3. URL拼接错误

你写的url/?id=charr[i].id是字符串字面量,并没有把chart[i].id的实际值拼进去,应该是笔误(charr应该是chart)+ 字符串拼接错误。


具体修复步骤

第一步:修改HTML中的图表容器

给每个Cardview里的图表容器设置唯一ID,比如:

<!-- 第一个Cardview -->
<div class="card-view">
  <div id="chartdiv-0"></div>
</div>
<!-- 第二个Cardview -->
<div class="card-view">
  <div id="chartdiv-1"></div>
</div>
<!-- 第三个Cardview -->
<div class="card-view">
  <div id="chartdiv-2"></div>
</div>

第二步:重构前端循环代码

推荐使用forEach循环代替for循环(天然解决异步变量绑定问题),同时修正ID和URL拼接:

// 假设chart是你的数据数组
chart.forEach((chartItem, index) => {
  AmCharts.makeChart(`chartdiv-${index}`, { 
    type: "serial", 
    theme: "light", 
    marginRight: 40, 
    marginLeft: 40, 
    autoMarginOffset: 20, 
    mouseWheelZoomEnabled: true, 
    dataDateFormat: "YYYY-MM-DD", 
    dataLoader: { 
      // 修正URL拼接:用模板字符串注入实际ID,同时修正变量名charr为chart
      url: `${url}?id=${chartItem.id}`, 
      format: "json" 
    }, 
    categoryField: "date_created", // 注意:后端返回的是date_created,你之前写的是date,要对应!
    rotate: false, 
    categoryAxis: { 
      gridPosition: "start", 
      axisColor: "#DADADA", 
      labelRotation: 90, 
      wrap: true, 
      parseDates: false, 
      dashLength: 1, 
      minorGridEnabled: true, 
    }, 
    valueAxes: [{ 
      id: "v1", 
      axisAlpha: 0, 
      position: "left", 
      ignoreAxisWidth: true 
    }], 
    graphs: [{ 
      id: "g1", 
      fillAlphas: 0.5, 
      balloon: { 
        borderThickness: 3, 
        horizontalPadding: 17, 
        offsetX: 50, 
        offsetY: 8 
      }, 
      bullet: "round", 
      bulletBorderAlpha: 1, 
      bulletColor: "#FFFFFF", 
      bulletSize: 5, 
      hideBulletsCount: 50, 
      lineColor: "#2AB4C0", 
      lineThickness: 2, 
      title: "Total", 
      useLineColorForBulletBorder: true, 
      valueField: "total", 
      balloonText: "[[title]] [[date_created]]:<b>[[total]]</b>" // 同样,这里的date要改成date_created
    }], 
    chartScrollbar: { 
      graph: "g1", 
      oppositeAxis: false, 
      offset: 30, 
      scrollbarHeight: 80, 
      backgroundAlpha: 0, 
      selectedBackgroundAlpha: 0.1, 
      selectedBackgroundColor: "#888888", 
      graphFillAlpha: 0, 
      graphLineAlpha: 0.5, 
      selectedGraphFillAlpha: 0, 
      selectedGraphLineAlpha: 1, 
      autoGridCount: true, 
      color: "#AAAAAA" 
    }, 
    chartCursor: { 
      pan: true, 
      valueLineEnabled: true, 
      valueLineBalloonEnabled: true, 
      cursorAlpha: 1, 
      cursorColor: "#258cbb", 
      limitToGraph: "g1", 
      valueLineAlpha: 0.2, 
      valueZoomable: true 
    }, 
    valueScrollbar: { 
      oppositeAxis: false, 
      offset: 50, 
      scrollbarHeight: 10 
    }, 
    export: { enabled: true } 
  }); 
});

注意:我还修正了一个细节——你前端配置里的categoryField: "date"和后端返回的date_created字段不匹配,这也会导致图表加载失败,必须统一!

第三步:后端代码小优化

你的后端代码里$arr没有初始化,虽然你说能获取数据,但为了避免潜在错误,建议加上初始化:

public function fetch_all_chartdiv(){ 
  $id= $_GET['id']; 
  $arr = []; // 新增:初始化数组
  $data = $this->model->get_all_chart($id); 
  foreach ($data as $usg) { 
    array_push($arr, ["total" => ($usg->total), "date_created" => $usg->date]); 
  } 
  echo json_encode($arr); 
}

这样修改后,三个图表会分别渲染到对应的容器中,每个容器请求对应ID的数据,就能解决你遇到的加载和数据错位问题了。

内容的提问来源于stack exchange,提问作者Janessa Bautista

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:16:08