如何用Angular计算元素



我有一个全局控制器,我想计数一些元素,因为之后我将范围在不同的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值

最新更新