javascript - Highcharts 异步钻取(3 级)- 钻取不起作用

标签 javascript highcharts

我在 highcharts 中创建了一个异步钻取(Treemap1 到 Treemap2 到折线图)。每次向下钻取都从服务器获取数据。向下钻取功能按预期工作。从 Treemap2 向上钻取到 Treemap1 也有效。

但是当我尝试从折线图向上钻取到 Treemap2 时,出现错误:

Uncaught TypeError: Cannot read property 'x' of null 

在此钻取过程中,我检查了系列数据,发现它是空的。

这是下钻事件的代码:

drilldown(e){

    let drilldown_point = e.point;
    let chart = this;
    let current_level = 0;

    if(chart.drilldownLevels){
        current_level = chart.drilldownLevels.length;
    }

    //api call to get drill down data based on current level of drilldown
    if(current_level == 0){
        level_0_point_name = e.point.name;
        chart.showLoading('Loading ...');
        Api()
        .get('/dataFromServer')
        .then(response => {

            //get sub series data and set drilldown = true for 2nd  level drilldown
            let sub_series_data = response.data;
            sub_series_data.map(value => value.drilldown = true);

            //create series for sub treemap
            let sub_series = {
                type: 'treemap',
                data: sub_series_data,
            };

            //Update title and subtitle of subchart
            chart.update({
                title: {
                    text: "1st Level Drilldown"
                },
                subtitle: {
                    text: ""
                }

            });

            chart.addSeriesAsDrilldown(drilldown_point, sub_series);
            chart.applyDrilldown();
            chart.hideLoading();
        });
    }
    else if(current_level == 1){
        // console.log(this)
        level_1_point_name = e.point.name;
        chart.showLoading('Loading ...');
        Api()
        .get('/dataFromServer')
        .then(response => {

            //get sub series data and set drilldown = true for 2nd  level drilldown
            let sub_series_data = response.data;
            let x_axis_categories = sub_series_data.map(value => value.name)

            //create series for sub treemap
            let sub_series = {
                type: 'line',
                name: 'LineChart',
                colorByPoint: true,
                data: sub_series_data,
            };

            //Update title and subtitle of subchart
            chart.update({
                title: {
                    text: "2nd Level Drilldown"
                },
                subtitle: {
                    text: ""
                },
                yAxis: {
                    title: {
                        text: 'Number'
                    }
                },
                xAxis: {
                    title: {
                        text: 'X-axis title'
                    },
                    categories: x_axis_categories
                }

            });

            chart.addSeriesAsDrilldown(drilldown_point, sub_series);
            chart.applyDrilldown();
            chart.hideLoading();
        });
    }

}

这是问题的 fiddle 链接 - https://jsfiddle.net/gaurav_neema/gkdoa9jr/7/

我已经简化了 2 个级别的代码。向下钻取到任何节点,然后再次按返回按钮进行向上钻取。

这个错误的原因是什么?

最佳答案

你可以从this中得到一个想法我在 here 上找到的 fiddle .您必须在 drillup() 事件下更新聊天。以下是来自 fiddle 的示例代码。

Highcharts.chart('container', {

  chart: {
    events: {
      drilldown: function(e) {
        console.log(this)
        var chart = this,
          drilldowns = chart.userOptions.drilldown.series,
          series = [];
        Highcharts.each(drilldowns, function(p, i) {
          if (p.id === e.point.name) {
            chart.addSingleSeriesAsDrilldown(e.point, p);
          }
        });
        chart.applyDrilldown();
        chart.update({
          chart: {
            type: 'column'
          }
        })
      },
      drillup: function() {
        let chart = this;
        console.log(this)
        chart.update({
          chart: {
            type: 'treemap',
          }
        })
      }
    }
  },
  
  legend: {
    enabled: true
  },

  series: [{
    animation: false,
    type: "treemap",
    data: [{
      id: 'B',
      name: 'Bananas',
      color: "#ECE100"
    }, {
      name: 'Anne',
      parent: 'B',
      value: 3,
      drilldown: true
    }, {
      name: 'Rick',
      parent: 'B',
      value: 10,
      drilldown: 'BRickSales'
    }, {
      name: 'Peter',
      parent: 'B',
      value: 1

    }]
  }],

  drilldown: {
    series: [{
      name: 'Ricks quotes',
      id: 'Rick',
      type: 'column',
      data: [
        ['v11', 30],
        ['v8', 17],
        ['v9', 8],
        ['v10', 5],
        ['v7', 3]
      ]
    }, {
      name: 'Rick Calls',
      id: 'Rick',
      type: 'line',
      data: [
        ['v11', 50],
        ['v8', 40],
        ['v9', 60],
        ['v10', 65],
        ['v7', 73]
      ]
    }, {
      name: 'Anne quotes',
      id: 'Anne',
      type: 'column',
      data: [
        ['v11', 2],
        ['v8', 7],
        ['v9', 3],
        ['v10', 5],
        ['v7', 3]
      ]
    }, {
      name: 'Anne Calls',
      id: 'Anne',
      type: 'line',
      data: [
        ['v11', 50],
        ['v8', 40],
        ['v9', 60],
        ['v10', 65],
        ['v7', 73]
      ]
    }]
  },

});

关于javascript - Highcharts 异步钻取(3 级)- 钻取不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56268665/

相关文章:

highcharts - 设置 highcharts 日期工具提示格式以显示时区

javascript - 单击按钮时触发事件

javascript - 将大型 IIAF 拆分为较小的函数是否可以提高性能?

javascript - 具有父节点和公共(public)节点的 d3 和 Highcharts 图

javascript - 顶部 y 轴与底部 y 轴重叠

jquery - ng2-charts 实时数据动画

javascript - flowtype 似乎认为 Object.keys 输出始终是字符串数组,即使它知道得更好

javascript - JSON数组转成字符串后显示undefined

javascript - 处理相对于 Canvas 而不是图像可拖动的旋转 Canvas 图像

javascript - 在 highcharts 中使用动态 html 渲染标题