Итак, у меня есть эта группа данных 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» каждому присваивается то же последнее известное вычисленное значение, а не отдельные расчетные значения для каждого экземпляра. Есть идеи?
НЕ ВЫЗЫВАЙТЕ функцию с побочными эффектами внутри наблюдаемого выражения '{{...}}' –
Независимо от вашего вопроса, проверьте 'typeof (start) && typeof (finish) && typeof (login) == = 'undefined'', вероятно, не делает то, что вы намеревались. – Avish