Highcharts错误“;无法读取未定义的属性“;

Highcharts error "cannot read property of undefined"

本文关键字:未定义 属性 读取 错误 Highcharts      更新时间:2023-09-26

我正在使用Highcharts创建一个图表(并从JSON文件中获取数据)。然而,我得到了TypeError: Cannot read property 'map' of undefined

我有以下代码:

myData.get(function (data) {
      $scope.loadData = data;
    });

$('#container').highcharts({
    xAxis: {
        type: 'datetime'
    },
    series: [{
        name: 'Temperature',
        data: $scope.loadData.map(function(d) {
          return [d.timestamp, d.actual];
        })
    }, {
        name: 'Range',
        data: $scope.loadData.map(function(d) {
          return [d.timestamp, d.min, d.max];
        }),
        type: 'arearange'
    }]
});

我还创建了一个Plunker。

关于我在这里做错了什么,有什么建议吗?

所以我将您的Plunkr更改为一个工作示例:http://plnkr.co/edit/Q4z6NdVtp3TRMKgmH5tc?p=preview

首先,在data.json中,您添加了时间戳作为字符串。Highchart不接受这一点。

我更改了工厂以通过$http 获取JSON数据

.factory('myData', function($http) { 
    return {
     getData : function () {
       var data = [];
      data = $http.get('data.json');
      return data;
     }
  }
})

在getData的回调中,我构建了图表:

myData.getData().then(function(response) { 
    $scope.loadData = response.data;
    $('#container').highcharts({
        xAxis: {
            type: 'datetime'
        },
        series: [{
            name: 'Temperature',
            data: [$scope.loadData.timestamp, $scope.loadData.actual]
        }, 
        {
            name: 'Range',
            data: [$scope.loadData.timestamp, $scope.loadData.min, $scope.loadData.max],
            type: 'arearange'
        }]
    });
  });

这是异步调用:

myData.get(function (data) {
    console.log("myData.Get");
    $scope.loadData = data;
});

因此$('#container').highcharts({...将在数据设置为$scope.loadData = data; 之前运行

你必须在myData 的回调中移动代码

myData.get(function (data) {
    $scope.loadData = data;
        $('#container').highcharts({
            xAxis: {
                type: 'datetime'
            },
            series: [{
                name: 'Temperature',
                data: $scope.loadData.map(function(d) {
                  return [d.timestamp, d.actual];
                })
            }, {
                name: 'Range',
                data: $scope.loadData.map(function(d) {
                  return [d.timestamp, d.min, d.max];
                }),
                type: 'arearange'
            }]
        });
});