我有一个全局控制器,我想计数一些元素,因为之后我将范围在不同的html。
'use strict';
angular.module('MainApp')
.factory('allInventoryFactory', function ($http, $q, myfactory) {
var deferred = $q.defer();
$http({
method: 'GET',
url: myfactory.URLOperation
}).success(function (data) {
angular.forEach(data, function (datainventary) {
var active = 0;
var pending = 0;
var desactive = 0;
var vodafone = 0;
var input = datainventary.sites;
input.forEach(function (input) {
if (input.ActivationStatus == 'AC') {
console.log("AC");
active++;
}
else if (input.ActivationStatus == 'PA') {
console.log("PA");
pending++;
}
else if (input.ActivationStatus == 'DE') {
console.log("DE");
desactive++;
}
//Contracting mode is independent of the ActivationStatus
if (input.ContractingMode == '2') {
console.log("Vodafone");
vodafone++;
}
});
})
}).error(function () {
deferred.reject('There was an error')
})
return deferred.promise;
});
每个计数器的全局结果是0
,代码不增加数字。我不知道如何继续。
您需要将计数变量的声明置于循环之外。否则,它们将被声明并在每次循环时初始化为0。
你在错误的范围内声明计数器/闭包
}).success(function (data) {
// declare these in the success
var counters = { 'AC' : 0, 'PA': 0, 'DE': 0, 'Vodafone':0 }
...
if (counters.hasOwnProperty(input.ActivationStatus)) {
counters[input.ActivationStatus]++;
console.log( input.ActivationStatus);
}
if (input.ContractingMode == '2') {
console.log("Vodafone");
counters.Vodafone++;
}
为什么不在promise完成/成功时调用defer.resolve('...')
来解决这个promise?您还应该在执行的全局作用域中声明计数器变量,而不是在input.forEach
迭代中声明。
另一种计算方法是
active = input.filter(function(i){
return i.ActivationStatus == 'AC';
}).length;
在input.forEach
循环外声明计数变量。每次它们重新初始化0值