2014-10-19 2 views
-1

Я пытаюсь вычислить общую сумму в вложенном ng-повторе. В консоли я получаю ошибку и суммарную сумму неправильно. Ссылка на код: Plunker. Мой шаблон и JSВычисление суммы нескольких вложенных циклов в угловом

<div ng-controller="MyController" class="container"> 

<div ng-repeat="key in goods"> 
    <h3>{{key.name}}</h3> 
    <div ng-repeat="good in key.group"> 
     <h4>{{good.goodName}}</h4> 
     <ul> 
      <li>Count: <input ng-model="good.items" value="{{good.items}}" type="text"></li> 
      <li>Times: <input ng-model="good.times" value="{{good.times}}" type="text"></li> 
      <li>Sum: {{sum(good)}}</li> 
     </ul> 
    </div> 
</div> 

<div class="total"> 
    <h2>Total sum: {{total()}}</h2> 
</div> 

</div> 

Мои ЯШ:

var app = angular.module('myApp', []); 

app.controller('MyController', ['$scope', function($scope){ 


$scope.allSum = 0; 

$scope.sum = function(good) { 
    $scope.allSum += good.items * good.times; 
    return good.items * good.times; 
}; 

$scope.total = function() { 
    return $scope.allSum; 
}; 


$scope.goods = [ 

    { 

     'name': 'name 1', 
     'group': [ 

        { 
         'goodName': 'good 1', 
         'items': '4', 
         'times': '2', 
         'sum': '8', 
         'id': '1' 
        }, 
        { 
         'goodName': 'good 2', 
         'items': '2', 
         'times': '2', 
         'sum': '4', 
         'id': '2' 
        } 

        ] 
    }, 
    { 


     'name': 'name 2', 
     'group': [ 

        { 
         'goodName': 'good 3', 
         'items': '1', 
         'times': '10', 
         'sum': '10', 
         'id': '3' 
        }, 
        { 
         'goodName': 'good 4', 
         'items': '3', 
         'times': '1', 
         'sum': '3', 
         'id': '4' 
        } 

        ] 

    } 




]; 

}]); 

В консоли я есть ошибка: Ошибка: [$ rootScope: infdig] и неправильная сумма.

+0

Я не думаю, что [$ rootScope: infdig] исходит из этого кода. Что касается неправильной суммы, вероятно, потому, что вы вычисляете строки вместо ints. Попробуйте $ scope.allSum + = parseInt (good.items) * parseInt (good.times); – Brian

+0

Брайан, мне это не помогло. Сумма ошибочна. Я думаю, проблема с дубликатами. Как я могу это исправить? – vova84

+0

Вам не хватает вашего закрывающего div на вашем контроллере div. Это просто опечатка? – Brian

ответ

0

Проблема заключается в том, что ваша функция работает дважды. Гораздо лучше и чище подход заключается в использовании функции часов, которая обновляет все:

$scope.$watch('goods', function(newValue) { 
    if (newValue !== undefined) { 
     $scope.allSum = 0; 
     angular.forEach(newValue, function(val, key) { 
      angular.forEach(val.group, function(v, k) { 
       v.sum = v.items * v.times; 
       $scope.allSum += v.sum; 
      }); 
     }); 
    } 
}, true); 

Теперь вы можете избавиться от суммы и общих функций полностью. Затем просто обновите свой html следующим образом:

<div ng-controller="MyController" class="container"> 
    <div ng-repeat="key in goods"> 
     <h3>{{key.name}}</h3> 
     <div ng-repeat="good in key.group"> 
      <h4>{{good.goodName}}</h4> 
      <ul> 
       <li>Count: <input ng-model="good.items" value="{{good.items}}" type="text"></li> 
       <li>Times: <input ng-model="good.times" value="{{good.times}}" type="text"></li> 
       <li>Sum: {{good.sum}}</li> 
      </ul> 
     </div> 
    </div> 

    <div class="total"> 
     <h2>Total sum: {{allSum}}</h2> 
    </div> 
</div> 
+0

Брайан благодарит вас! Это помогло! Но теперь общая сумма не изменилась ... это 25) – vova84

+0

Да, я это заметил. Вместо того, чтобы идти повсюду и сделать код более сложным, я сделал вам функцию часов, которая работает очень хорошо. Проверьте мои изменения. – Brian

+0

Брайан спасибо !!!!! – vova84

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