2015-05-06 2 views
1

Работа с диаграммой js и ее выполнение, чтобы сделать то, что мне нужно, которое извлекает данные из веб-службы и использует $interval для ее обновления. Когда я обновляю диаграмму с помощью встроенной функции обновления, она отображается снова, как ожидалось, но со старыми данными в ней. Я думал, что я очищаю данные из массива, я новичок в угловом, поэтому, возможно, я что-то упустил.Обновления диаграммы пончиков с удвоенной информацией

Это js для того, что происходит.

angular.module('myapp', []) 
    .controller('MainCtrl', function($scope, $http, $interval) { 
    $scope.doughnutData = []; 
    var myDoughnut = ''; 
    onload = function() { 
     $http.get('https://api.myjson.com/bins/59zvx').success(function(returnedData) { 

     $scope.username = returnedData.name; 
     $scope.totalscore = returnedData.totalScore.toFixed(3); 

     returnedData.models.forEach(function(x) { 
      var score = x.score.toFixed(3); 
      console.debug(score); 
      if (score >= 75) { 
      $scope.doughnutData.push({ 
       'value': x.score, 
       'color': '#F7464A', 
       'highlight': '#FF5A5E', 
       'label': x.name 
      }); 
      } else if (score >= 50) { 
      $scope.doughnutData.push({ 
       'value': x.score, 
       'color': '#FDB45C', 
       'highlight': '#FFC870', 
       'label': x.name 
      }); 
      } else { 
      $scope.doughnutData.push({ 
       'value': x.score, 
       'color': '#424242', 
       'highlight': '#686868', 
       'label': x.name 
      }); 
      } 
     }); 
     $scope.doughnutData = sortByKey($scope.doughnutData, 'value'); 
     var ctx = document.getElementById("chart-area").getContext("2d"); 
     myDoughnut = new Chart(ctx).Doughnut($scope.doughnutData, { 
      responsive: true 
     }); 
     }); 
     mainInterval = $interval(function() { 
     doughnutData = ''; 
     $http.get('https://api.myjson.com/bins/59zvx').success(function(returnedData) { 
      $scope.username = returnedData.name; 
      $scope.totalscore = returnedData.totalScore.toFixed(3); 

      returnedData.models.forEach(function(x) { 
      var score = x.score.toFixed(3); 
      console.debug(score); 
      if (score >= 75) { 
       $scope.doughnutData.push({ 
       'value': x.score, 
       'color': '#F7464A', 
       'highlight': '#FF5A5E', 
       'label': x.name 
       }); 
      } else if (score >= 50) { 
       $scope.doughnutData.push({ 
       'value': x.score, 
       'color': '#FDB45C', 
       'highlight': '#FFC870', 
       'label': x.name 
       }); 
      } else { 
       $scope.doughnutData.push({ 
       'value': x.score, 
       'color': '#424242', 
       'highlight': '#686868', 
       'label': x.name 
       }); 
      } 
      }); 
      $scope.doughnutData = sortByKey($scope.doughnutData, 'value'); 
      myDoughnut.segments = doughnutData; 
      myDoughnut.update(); 
     }); 
     }, 5000); 
     $scope.$apply(); 
    }; 

    function sortByKey(array, key) { 
     return array.sort(function(a, b) { 
     var x = a[key]; 
     var y = b[key]; 
     return ((x < y) ? -1 : ((x > y) ? 1 : 0)); 
     }); 
    } 
    }); 

Так начинается с 9 значений, и при обновлении он имеет 18, и т.д .. Там нет ничего о себе, что будет обновлять (я просто его там теперь, когда я переместить его в моей производственной WebService). Я думал, что doughnutData = ''; в разделе $interval очистит его?

Требуется включить HTML, а также, чтобы дать лучшее представление о том, что происходит:

<html> 

    <head> 
    <script src="https://code.jquery.com/jquery-2.1.4.min.js"></script> 
    <script src="../Chart.js"></script> 
    <script src="../src/Chart.Doughnut.js"></script> 
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js"></script> 
    <link rel="stylesheet" href="style.css" /> 
    <script src="../script.js"></script> 
    </head> 

    <body ng-app="myapp" ng-controller="MainCtrl"> 
    <div id="canvas-holder"> 
     <canvas id="chart-area" width="50" height="50"></canvas> 
    </div> 
    </body> 

</html> 

ответ

1

пытаются изменить в функции mainInterval

doughnutData = ''; 

с

$scope.doughnutData = []; 

В угловом режиме вы получаете доступ к полям по объекту $ scope

+0

Да, я пробовал это в прошлом, но вызывает ряд других ошибок. – erp

+0

Какие ошибки? – jcmiller11

+0

В нижней части '$ interval' он говорит в этой строке' myDoughnut.segments = doughnutData; '' 'doughnutData' не определен. И если я изменю эту строку на 'myDoughnut.segments = $ scope.doughnutData ;, тогда она скажет, что функция обновления не работает. – erp

1
mainInterval = $interval(function() { 
     $scope.doughnutData = []; 
     $http.get('https://api.myjson.com/bins/59zvx').success(function(returnedData) { 
      $scope.username = returnedData.name; 
      $scope.totalscore = returnedData.totalScore.toFixed(3); 

      returnedData.models.forEach(function(x) { 
      var score = x.score.toFixed(3); 
      console.debug(score); 
      if (score >= 75) { 
       $scope.doughnutData.push({ 
       'value': x.score, 
       'color': '#F7464A', 
       'highlight': '#FF5A5E', 
       'label': x.name 
       }); 
      } else if (score >= 50) { 
       $scope.doughnutData.push({ 
       'value': x.score, 
       'color': '#FDB45C', 
       'highlight': '#FFC870', 
       'label': x.name 
       }); 
      } else { 
       $scope.doughnutData.push({ 
       'value': x.score, 
       'color': '#424242', 
       'highlight': '#686868', 
       'label': x.name 
       }); 
      } 
      }); 
      $scope.doughnutData = sortByKey($scope.doughnutData, 'value'); 
      myDoughnut.segments = $scope.doughnutData; 
      myDoughnut.update(); 
     }); 
     }, 5000); 
+0

Это почему-то заставляет функцию' update() 'не работать. Не совсем уверен, почему. – erp

+0

вы можете создать jsFiddle, вышеприведенный код должен сработать, вы получили какую-либо ошибку на консоли? – vinayakj

+0

, вы должны обновить диаграмму неправильно, см. API диаграмм, чтобы обновить диаграмму. – vinayakj

Смежные вопросы