У меня есть небольшой фрагмент образца здесь, где я пытался получить в общей сложности значений углового, как,
<div id="app" ng-app="myApp" ng-controller="myCtrl" ng-init="total = 0">
<ul>
<li ng-repeat="x in myarr" > {{x.val}}
<span ng-if="$last">, Total - {{total = total+x.val}}</span>
</li>
</ul>
</div>
Но сумма неверна. Как это можно достичь?
EDIT: Я пытаюсь получить общее количество в цикле ng-repeat
рядом с последним элементом. В этом вопросе есть принятый ответ, и ниже ответ также работает в той же логике. Но в этом методе функция getTotal()
будет вызывать myarr.length
раз и каждый раз, когда массив циклы в контроллере вправо? Так, например, в вопросе, массив будет полностью зацикливаться 6 раз (myarr.length
+ один раз в ng-repeat
т. myarr.length
5 + 1). Я ошибаюсь?
Попробуйте этот метод, никакой функции не используется в контроллере, используя ng-init
в ng-repeat
angular.module('myApp', []).controller('myCtrl', function($scope) {
$scope.myarr = [{id: 1, val: 500},{id: 2,val: 300},{id: 3,val: 200},{id: 4,val: 600},{id: 5,val: 100}];
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div id="app" ng-app="myApp" ng-controller="myCtrl" ng-init="total=0">
<ul >
<li ng-repeat="x in myarr" ng-init="$parent.total = $parent.total + (x.val)"> {{x.val}}
<span ng-if="$last">{{total}}</span>
</li>
</ul>
</div>
Используйте array.reduce
для добавления суммы массива Link
angular.module('myApp', []).controller('myCtrl', function($scope) {
$scope.myarr = [{id: 1, val: 500},{id: 2,val: 300},{id: 3,val: 200},{id: 4,val: 600},{id: 5,val: 100}];
$scope.addTotal = function(){
var sum = $scope.myarr.reduce($scope.add);
return sum.val;
}
$scope.add = function(a,b){
return {val:a.val + b.val};
}
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div id="app" ng-app="myApp" ng-controller="myCtrl" ng-init="total=0">
<ul >
<li ng-repeat="x in myarr" > {{x.val}}
<span ng-if="$last">{{addTotal()}}</span>
</li>
</ul>
</div>
$parent
Вы можете использовать angular.forEach
для цикла и иметь общий счет.
angular.module('myApp', []).controller('myCtrl', function($scope) {
$scope.total = 0;
$scope.myarr = [{id: 1, val: 500},{id: 2,val: 300},{id: 3,val: 200},{id: 4,val: 600},{id: 5,val: 100}];
angular.forEach($scope.myarr, function(value){$scope.total+=value.val});
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div id="app" ng-app="myApp" ng-controller="myCtrl">
<ul >
<li ng-repeat="x in myarr" > {{x.val}}
<span ng-if="$last">{{total}}</span>
</li>
</ul>
</div>
Попробуйте выполнить все вычисления в самом угловом контроллере и сохраните его в varaible. Но если вы беспокоитесь о постоянном изменении значений в массиве, вы также можете использовать функцию calcTotal в вашем контроллере. Также ng-repeat
должен быть на li
а не ul
.
<div id="app" ng-app="myApp" ng-controller="myCtrl" ng-init="total = 0">
<ul >
<li ng-repeat="x in myarr"> {{x.val}}
<span ng-if="$last">, Total - {{getTotal()}} or {{totalValue}}</span>
</li>
</ul>
</div>
Ваш контроллер будет как
angular.module('myApp', []).controller('myCtrl', function($scope) {
$scope.myarr = [{id: 1, val: 500},{id: 2,val: 300},{id: 3,val: 200},{id: 4,val: 600},{id: 5,val: 100}];
//first approach
$scope.totalValue = 0;
for(i=0;i<$scope.myarr.length;i++){
if($scope.myarr[i] && $scope.myarr[i].val)
$scope.totalValue+=$scope.myarr[i].val;
}
//OR
//second approach
$scope.getTotal = function(){
var total = 0;
for(i=0;i<$scope.myarr.length;i++){
if($scope.myarr[i] && $scope.myarr[i].val)
total+=$scope.myarr[i].val;
}
return total;
}
});
Если вы используете переменный подход, вам придется явно вычислять $ scope.getTotal каждый раз, когда изменяются значения массива. По функциональному подходу это будет само по себе, но функции привязки в пользовательском интерфейсе немного дороги, поскольку они продолжают пересчитывать каждый цикл дайджеста.
1700
в данном примере и массив генерируется динамически.
ng-repeat
рядом с последним элементом.