问题描述
我有一个全局控制器,我想在其中计算一些元素,因为之后我将在另一个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 ,代码不会增加数字。
而且我不知道该如何继续。
1楼
您需要将计数变量的声明置于循环之外。 否则,将在每次循环时声明它们并将其初始化为0。
2楼
您在错误的范围/关闭中声明了计数器
}).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++;
}
3楼
您为什么不通过在承诺完成/成功时调用defer.resolve('...')来解决承诺?
您还应该在执行的全局范围内而不是在input.forEach迭代内部声明计数器变量。
4楼
另一种计算方法是
active = input.filter(function(i){
return i.ActivationStatus == 'AC';
}).length;
5楼
在循环input.forEach之外声明计数变量。
每次他们重新初始化0值