2015-05-12 5 views
3

Итак, у меня есть эта группа данных JSON, и я хочу сделать некоторые вычисления и добавить результаты и создать новый ключ в JSON. Я настроил службы расчета, которые я затем использую в контроллере. Но проблема в том, что он только подталкивает последнее известное значение в каждый вновь созданный ключ «rate».Рассчитать и добавить JSON с новым ключом и значением AngularJS

JSON как это:

[{ "date"  : "2015-09-01", 
"start"  : "2015-09-01 08:00:00", 
"finish" : "2015-09-01 10:00:00", 
"loggedIn" : "2015-09-01 08:06:27", 
"loggedOut" : "2015-09-01 10:06:27" 

}, { "date"  : "2015-09-02", 
"start"  : "2015-09-02 08:00:00", 
"finish" : "2015-09-02 10:00:00", 
"loggedIn" : "2015-09-02 08:02:05", 
"loggedOut" : "2015-09-02 10:02:11" 

}, { "date"  : "2015-09-03", 
"start"  : "2015-09-03 13:00:00", 
"finish" : "2015-09-03 14:30:00", 
"loggedIn" : "2015-09-03 13:11:05", 
"loggedOut" : "2015-09-03 14:31:01" 

}, { "date"  : "2015-09-04", 
"start"  : "2015-09-04 13:00:00", 
"finish" : "2015-09-04 14:30:00", 
"loggedIn" : "2015-09-04 13:01:05", 
"loggedOut" : "2015-09-04 14:31:01" 

}, { "date"  : "2015-09-05", 
"start"  : "2015-09-05 18:00:00", 
"finish" : "2015-09-05 21:00:00", 
"loggedIn" : "2015-09-05 18:30:05", 
"loggedOut" : "2015-09-05 21:00:51" 

}] 

Услуга следующим образом:

angular.module('appService', []) 
.service('CalculationService', function(){ 
    this.getTheRate = function(start, end, login) { 
     if (typeof (start) && typeof (end) && typeof (login) === 'undefined') { 
      return 'n/a'; 
     } else { 
      var startTime = new Date(start).getTime()/60000, 
       endTime = new Date(end).getTime() /60000, 
       loginTime = new Date(login).getTime()/60000; 

      var totalTime = endTime - startTime, 
       lateness = loginTime - startTime, 
       percentile = 100 - (lateness/totalTime) * 100; 

      return parseFloat(percentile).toFixed(1); 
     } 
    }; 

Контроллер так:

angular.module('MainController', []) 
.controller('mainCtrl', [ 
    '$http', 
    'CalculationService', 
    function($http, CalculationService){ 

     var logins = this; 

     logins.dataStore = []; 

     logins.add = function(temp){ 
      logins.dataStore.push(temp); 
     }; 

     $http.get('./theData.json').success(function(data){ 
      logins.data = []; 
      logins.data = data; 
     }); 

     logins.getRate = function(start, end, login) { 
      angular.forEach(logins.data, function(obj){ 
       obj.rate = {}; 
       obj.rate = CalculationService.getTheRate(start, end, login); 
       return obj.rate; 
      }); 
     }; 
}]); 

разметки, как так:

<div ng-controller="mainCtrl as main"> 
<section class="view-section"> 
      <div class="view" ng-repeat="item in main.data"> 
       {{ main.getRate(item.start, item.finish, item.loggedIn) }} 
       {{ item.rate }} 
      </div> 
</section> 
</div> 

{{item.rate}} выдает только тонкие значения в ngRepeat, но когда я проверил данные через {{main.data}}, ключ создается для каждого экземпляра, но значение, однако, не вставлено правильно, в котором все клавиши «rate» каждому присваивается то же последнее известное вычисленное значение, а не отдельные расчетные значения для каждого экземпляра. Есть идеи?

+0

НЕ ВЫЗЫВАЙТЕ функцию с побочными эффектами внутри наблюдаемого выражения '{{...}}' –

+0

Независимо от вашего вопроса, проверьте 'typeof (start) && typeof (finish) && typeof (login) == = 'undefined'', вероятно, не делает то, что вы намеревались. – Avish

ответ

1

getRate Вашей функция вызывает вычисление в цикле по всем данным (с использованием angular.forEach), но с использованием того же start, finish и login значения. Затем вы вызываете эту функцию внутри ngRepeat, которая создает второй цикл. Поэтому каждая итерация цикла ngRepeat присваивает скорость текущего элемента всем элементам. Вот почему к тому времени, когда вы закончите, все предметы имеют скорость последнего элемента.

Вместо этого вызовите цикл вычисления скорости в контроллере сразу после получения данных (буквально сразу после назначения logins.data в обратном вызове $http.get), а не в выражении {{...}}. Как отмечают в комментариях, неплохо было бы вызвать функцию с побочными эффектами внутри выражения.

Также обратите внимание, что эта ошибка стала возможной, поскольку ваша функция getRate назначает скорость объекту (фактически, всем объектам) и возвращает его. Это запутанно и подвержено ошибкам. Было бы проще, если бы функция либо назначила ставку, либо вернула ее, но не обе.

+0

Ahhhh ... Спасибо за разъяснение. Я сделаю это. – BananaInPyjama

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