невозможно нарисовать круговую диаграмму в angularjs с использованием старших графиков - PullRequest
0 голосов
/ 20 декабря 2018

У меня есть приложение AngularJS (angularJS 1), и я пытаюсь создать базовую круговую диаграмму, используя данные, которые я получаю из API, вот мой код:

index.html:

<!doctype html>
<html>
<head>
  <meta charset="utf-8">
  <title>My Page</title>
  <meta name="viewport" content="width=device-width">
  <link rel="stylesheet" href="bower_components/bootstrap/dist/css/bootstrap.css" />
  <link rel="stylesheet" href="styles/main.css">
</head>
<body ng-app="myApp">
  <div ng-controller="myCtrl" class="wrapper">
    This is my Pie Chart:
    <br>
    <div id="mypie"></div>
  </div>
  <script src="bower_components/angular/angular.js"></script>
  <script src="bower_components/jquery/dist/jquery.js"></script>
  <script src="bower_components/bootstrap/dist/js/bootstrap.js"></script>
  <script src="bower_components/highcharts/highcharts.js"></script>

  <script src="scripts/app.js"></script>
</body>
</html>

app.js

angular.module('myApp').controller('myCtrl', ['$scope', '$http', function ($scope, $http) {
  $scope.fetchData = function () {
  var url = 'http://localhost:8080/service/piedata';
  $http({
      method: 'GET',
      url: url
    })
    .then(
      function (response) {
        $scope.myData = response.data;
        console.log($scope.myData);
        var chartConfig = {
          chart: {
            type: 'pie'
          },
          title: {
            text: 'My Pie Chart'
          },
          tooltip: {
            pointFormat: '{series.name}: <b>{point.percentage:.1f}%</b>'
          },
          plotOptions: {
            pie: {
              allowPointSelect: true,
              cursor: 'pointer',
              dataLabels: {
                enabled: true,
                format: '<b>{point.name}</b>: {point.percentage:.1f} %',
                style: {
                  color: (Highcharts.theme && Highcharts.theme.contrastTextColor) || 'black'
                }
              }
            }
          },
          series: [{
            data: $scope.myData
          }]
        };
        Highcharts.chart('mypie', chartConfig);
      },
      function (err) {
        console.log('ERROR: ' + JSON.stringify(err));
      }
    );
  };

  $scope.fetchData();
}]);

данные в моем ответе таковы:

[{ '3': 10 }, { '4': 60 }, { '5': 30 }];

Теперь, когда яя запускаю приложение, я вижу загрузку страницы и статическое содержимое, а также белую область для круговой диаграммы, но я не вижу никакой загрузки данных.

Что я делаю не так?

РЕДАКТИРОВАТЬ:

забыл добавить файл main.js, где я объявляю свой угловой модуль.

main.js

angular.module('myApp', ['ui.router','ngMaterial','highcharts-ng'])

//there is some other stuff in this file like filters and config which is irrelevant here.

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Ваши данные для визуализации Круговая диаграмма не соответствует формату документа Highchart.Вы можете увидеть демо круговой диаграммы здесь https://www.highcharts.com/demo/pie-basic, чтобы знать.

Структура series:

    series: [{
        data: [{
            name: 'Chrome',
            y: 61.41
        }, {
            name: 'Internet Explorer',
            y: 11.84
        }, {
            name: 'Firefox',
            y: 10.85
        }]
    }]

Ваш ответ API-ответа в формате [{ '3': 10 }, { '4': 60 }, { '5': 30 }];Таким образом, вы можете исправить это на сервере (изменить значение ответа API) или изменить формат ответа на клиенте (просто):

const dataChart = myData.map(d => {
   const name = Object.keys(d)[0];
   return { name, y: d[name] }
})

и

series: [{
  data: dataChart
}]

Вы должны также указать свой угловойприложение angular.module('myApp', []), прежде чем использовать его с angular.module('myApp').controller('myCtrl', ....Я думаю, что вы заявили об этом, поэтому я не думаю, что это ошибка.

Я создал демо с простым API на http://5c1b231ee193d000132a73a8.mockapi.io/api/53860059. И это демо на jsfiddle https://jsfiddle.net/huynhsamha/fd80g7rp/

Вы также можете запустить его по фрагменту здесь:

angular.module('myApp', []).controller('myCtrl', ['$scope', '$http', function ($scope, $http) {

  const fetchData = function () {
    const url = 'https://5c1b231ee193d000132a73a8.mockapi.io/api/53860059';
    $http({ method: 'GET', url })
      .then(function (response) {
        const myData = response.data;
        console.log(myData);
        
        const dataChart = myData.map(d => {
          const name = Object.keys(d)[0];
          return { name, y: d[name] }
        })
        
        console.log(dataChart);
          
        const chartConfig = {
          chart: {
            type: 'pie'
          },
          title: {
            text: 'My Pie Chart'
          },
          tooltip: {
            pointFormat: '{series.name}: <b>{point.percentage:.1f}%</b>'
          },
          plotOptions: {
            pie: {
              allowPointSelect: true,
              cursor: 'pointer',
              dataLabels: {
                enabled: true,
                format: '<b>{point.name}</b>: {point.percentage:.1f} %',
                style: {
                  color: (Highcharts.theme && Highcharts.theme.contrastTextColor) || 'black'
                }
              }
            }
          },
          series: [{
            data: dataChart
          }]
        };

        Highcharts.chart('mypie', chartConfig);
      
      }, function (err) {
        console.log(err);
      });
  };

  fetchData();
}]);
<html ng-app="myApp">
<body>

<div ng-controller="myCtrl" class="wrapper">
  This is my Pie Chart:
  <br>
  <div id="mypie"></div>
</div>

</body>

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.7.5/angular.min.js"></script>

<script src="https://code.highcharts.com/highcharts.src.js"></script>

</html>
0 голосов
/ 20 декабря 2018

Несколько вещей ...

  • структура myData должна быть [{name: "ВАШЕ ИМЯ ЭТИКЕТКИ", y: 56.33}, ...]
  • угловое объявление должно быть angular.module ('myApp' , [] )
  • вы можете добавить $ http обратно ... но убедитесь, что форматсогласно требованию highcharts

Рабочая демонстрация ниже:

angular.module('myApp', [])
    .controller('myCtrl', ['$scope', function ($scope) {
      $scope.fetchData = function () {
          
            $scope.myData = [{ 'name':'3', y: 10 }, { 'name':'4', y: 60 }, { 'name':'5' ,y: 30 }];
            //console.log($scope.myData);
            var chartConfig = {
              chart: {            type: 'pie'          },
              title: {            text: 'My Pie Chart'          },
              tooltip: {            pointFormat: '{series.name}: <b>{point.percentage:.1f}%</b>'          },
              plotOptions: {
                pie: {              allowPointSelect: true,              cursor: 'pointer',              dataLabels: {                enabled: true,                format: '<b>{point.name}</b>: {point.percentage:.1f} %',
                    style: {                  color: (Highcharts.theme && Highcharts.theme.contrastTextColor) || 'black'                }
                  }
                }
              },
              series: [{
                data: $scope.myData
              }]
            };
            Highcharts.chart('mypie', chartConfig);
      };

      $scope.fetchData();
    }]);
<div ng-app="myApp">
  <div ng-controller="myCtrl" class="wrapper">
    This is my Pie Chart:
    <br>
    <div id="mypie"></div>
  </div>
</div>



<link href="https://cdnjs.cloudflare.com/ajax/libs/highcharts/6.2.0/css/highcharts.css"rel="stylesheet"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.7.5/angular.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/highcharts/6.2.0/highcharts.js"></script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...