我有一个经过过滤的列表(它是由时间过滤的,所以在特定的时间框架内),在这些项目上,我将使用ng-重复进行迭代。这些物品有名称和价格。因此,如果我迭代它们,我想实现的是,我总是这样显示“子”-total:
DATE NAME PRICE SUBTOTAL
2014-05 T-Shirt 20.00 20.00
2014-05 Jeans 45.00 65.00
2014-05 Cap 15.00 80.00
这些项按日期排序,但可能有不同的ID (ID与索引不匹配!)。
我真的找不出如何总是计算小计(表可以按日期范围过滤,这意味着我也可以包括从2014-04年的项目,它应该重新计算动态。
我在控制器中使用了这样的函数:
var curBalanceCounter2 = 0;
$scope.currentBalanceCalc = function(finance) {
curBalanceCounter2 = curBalanceCounter2 + finance.amount;
return curBalanceCounter2;
}
但是这个我被执行了10次所以我得到了错误的数字。有更好的解决办法吗?
谢谢。
发布于 2014-05-22 20:55:34
创建自定义筛选器
myApp.filter('subtotal', function(){
return function(items, index){
var subtotal = 0;
for (var i = 0; i <= index; i++) {
subtotal += items[i].price
}
return subtotal || items[index].price;
}
});
然后这样称呼它
<li ng-repeat="item in items">{{item.name}} - {{item.price}} -
{{ items | subtotal : $index}}</li>
演示
由于您可以访问ng-重复中的原始列表(例如,上面代码中的items
),所以可以将它连同当前项的索引传递到自定义筛选器中。然后,这个过滤器可以循环遍历每个项目,直到并包含传入的索引,然后返回一个小计。如果小计为0(与第一项相同),则返回该项目的价格。
博士:角自定义滤波器
发布于 2014-05-22 21:01:55
这与马克的回答很相似。在控制器中定义一个小计函数:
$scope.subtotal = function(index){
var total = 0;
angular.forEach($scope.data, function(value, key){
if(key <= index)
total += value.Price;
});
return total;
}
然后在视图中这样使用它:
<tr ng-repeat="d in data">
<td>{{d.Date}}</td>
<td>{{d.Name}}</td>
<td>{{d.Price}}</td>
<td>{{subtotal($index)}}</td>
</tr>
演示
更新
如果问题是数据尚未在客户端上排序,而是由ng-重复上的筛选器排序,那么下面是修复:将orderBy参数传递给小计函数,并在计算小计之前对数据执行筛选:
$scope.orderBy = 'Date';
$scope.subtotal = function(index, orderBy){
var total = 0;
angular.forEach($filter('orderBy')($scope.data,orderBy), function(value, key){
if(key <= index)
total += value.Price;
});
return total;
}
我已经用这段代码更新了我的演示。可以更改排序顺序,方法是将“日期”更改为“名称”或“价格”。
$scope.orderBy = 'Date';
并确保小计自动重新计算。
发布于 2014-05-22 20:34:11
我不知道有什么办法能做到纯粹的角度,也许有人会插话。
你所需要的看起来像是一个累积的总和:
function cSum(arr) {
var cumsum = [];
for(var i=0;i<arr.length;i++) {
if(i==0) cumsum[i] = arr[0];
else cumsum[i] = cumsum[i-1] + arr[i];
}
return cumsum
}
然后将该字段添加到正在重复的对象数组中,然后将其显示在表中。
https://stackoverflow.com/questions/23816341
复制相似问题