Вычисление суммы повторяющихся элементов в фильтре с использованием функции FILTER AngularJS - PullRequest
2 голосов
/ 10 июня 2019

У меня есть список, который показывает общее количество записей, при фильтрации одного имени он все равно показывает мне общее количество записей, а не сумму отфильтрованной записи. ПОПРОБУЙТЕ ЗДЕСЬ

<!DOCTYPE html>
<html>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.9/angular.min.js"></script>
<body ng-app="myApp">
  name:
<input type="text" ng-model="model_filter">
  <hr/>
    <table ng-controller="myCtrl" border="1">
        <tr ng-repeat="x in records | filter: model_filter">
            <td>{{x.Name}}</td>
            <td>{{x.Money | currency}}</td>
        </tr>
        <tr>
            <td>TOTAL</td>
            <td>{{Total | currency}}</td>
        </tr>
    </table>
    <script>
        var app = angular.module("myApp", []);
        app.controller("myCtrl", function ($scope) {
            $scope.records = [
                {
                    "Name": "Rodrigo",
                    "Money": 10
                },
                {
                    "Name": "Rodrigo",
                    "Money": 25
                },
                {
                    "Name": "Arnodl",
                    "Money": 15
                },
                {
                    "Name": "Carlos",
                    "Money": 5
                }
            ]
            $scope.Total = 0;
            for (var i = 0; i < $scope.records.length; i++) {
                $scope.Total += $scope.records[i].Money;
            }

        });
    </script>

</body>
</html>

РЕЗУЛЬТАТ:

enter image description here

С ФИЛЬТРОМ:

enter image description here

МОЯ ПРОБЛЕМА

enter image description here

Ответы [ 2 ]

2 голосов
/ 10 июня 2019

<!DOCTYPE html>
<html>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.9/angular.min.js"></script>

<body ng-app="myApp">
  name:
  <input type="text" ng-model="model_filter">
  <hr/>
  <table ng-controller="myCtrl" border="1">
    <tr ng-repeat="x in records | filter: model_filter">
      <td>{{x.Name}}</td>
      <td>{{x.Money | currency}}</td>
    </tr>
    <tr>
      <th>TOTAL</th>
      <td>{{Total()}}</td>
    </tr>
    <tr>
      <th>TotalFiltered</th>
      <td>{{ TotalFiltered() }}</td>
    </tr>
  </table>
  <script>
    var app = angular.module("myApp", []);
    app.controller("myCtrl", function($scope) {
      $scope.records = [{
          "Name": "Rodrigo",
          "Money": 10
        },
        {
          "Name": "Rodrigo",
          "Money": 25
        },
        {
          "Name": "Arnodl",
          "Money": 15
        },
        {
          "Name": "Carlos",
          "Money": 5
        }
      ]
      $scope.Total = () => $scope.records.reduce((total, b) => total + b.Money, 0);
      $scope.TotalFiltered = () => {
        return $scope.records.reduce((total, b) => {
          if ($scope.model_filter && b.Name.toUpperCase().includes($scope.model_filter.toUpperCase())) { return total + b.Money; }
          else { return total; }
        }, 0);
      }
    });
  </script>

</body>

</html>
2 голосов
/ 10 июня 2019

Для достижения ожидаемого результата используйте нижеприведенную опцию

  1. Использовать переменную области видимости для отфильтрованных значений

    ng-repeat = "x в FilterValues ​​= (records | filter: model_filter")) "

2. Используйте ng-keyup для получения отфильтрованных значений в поле ввода

<input type="text" ng-model="model_filter" ng-keyup="calcTotal($event)">

3.В событии Key up снова вычислите сумму с отфильтрованными значениями

$scope.calcTotal = function(e){
            $scope.Total = 0;
            for (var i = 0; i < $scope.filtered.length; i++) {
                     $scope.Total += $scope.filtered[i].Money;

            }
          }

codepen - https://codepen.io/nagasai/pen/KjPrvr

<!DOCTYPE html>
<html>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.9/angular.min.js"></script>
<body ng-app="myApp" ng-controller="myCtrl">
  name:
<input type="text" ng-model="model_filter" ng-keyup="calcTotal($event)">
  <hr/>
    <table border="1">
        <tr ng-repeat="x in filteredValues = (records | filter: model_filter)">
            <td>{{x.Name}}</td>
            <td>{{x.Money | currency}}</td>
        </tr>
        <tr>
            <td>TOTAL</td>
            <td>{{Total | currency}}</td>
        </tr>
    </table>
    <script>
        var app = angular.module("myApp", []);
        app.controller("myCtrl", function ($scope) {
          $scope.calcTotal = function(e){
            $scope.Total = 0;
            for (var i = 0; i < $scope.filteredValues.length; i++) {
                     $scope.Total += $scope.filteredValues[i].Money;
              
            }
          }
            $scope.records = [
                {
                    "Name": "Rodrigo",
                    "Money": 10
                },
                {
                    "Name": "Rodrigo",
                    "Money": 25
                },
                {
                    "Name": "Arnodl",
                    "Money": 15
                },
                {
                    "Name": "Carlos",
                    "Money": 5
                }
            ]
            $scope.Total = 0;
            for (var i = 0; i < $scope.records.length; i++) {
                     $scope.Total += $scope.records[i].Money;
              
            }
        });
    </script>

</body>
</html>

Ошибка из вашего кода: Подсчет итогов по $ scope.records, который остается неизменным, всегда с фильтром и без фильтра
Итого вычисляетсяпри первоначальной загрузке с $ scope.records, а не с фильтром

...