首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在ng中计算-从前面的条目重复

在ng中计算-从前面的条目重复
EN

Stack Overflow用户
提问于 2014-05-22 20:19:44
回答 4查看 2.5K关注 0票数 0

我有一个经过过滤的列表(它是由时间过滤的,所以在特定的时间框架内),在这些项目上,我将使用ng-重复进行迭代。这些物品有名称和价格。因此,如果我迭代它们,我想实现的是,我总是这样显示“子”-total:

代码语言:javascript
运行
复制
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年的项目,它应该重新计算动态。

我在控制器中使用了这样的函数:

代码语言:javascript
运行
复制
var curBalanceCounter2 = 0;

$scope.currentBalanceCalc = function(finance) {
  curBalanceCounter2 = curBalanceCounter2 + finance.amount;
  return curBalanceCounter2;
}

但是这个我被执行了10次所以我得到了错误的数字。有更好的解决办法吗?

谢谢。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-05-22 20:55:34

创建自定义筛选器

代码语言:javascript
运行
复制
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;
  }
});

然后这样称呼它

代码语言:javascript
运行
复制
<li ng-repeat="item in items">{{item.name}} - {{item.price}} -
{{ items | subtotal : $index}}</li>

演示

由于您可以访问ng-重复中的原始列表(例如,上面代码中的items ),所以可以将它连同当前项的索引传递到自定义筛选器中。然后,这个过滤器可以循环遍历每个项目,直到并包含传入的索引,然后返回一个小计。如果小计为0(与第一项相同),则返回该项目的价格。

博士:角自定义滤波器

票数 4
EN

Stack Overflow用户

发布于 2014-05-22 21:01:55

这与马克的回答很相似。在控制器中定义一个小计函数:

代码语言:javascript
运行
复制
$scope.subtotal = function(index){         
     var total = 0;
     angular.forEach($scope.data, function(value, key){
       if(key <= index)
         total += value.Price;           
     });
     return total;
   }

然后在视图中这样使用它:

代码语言:javascript
运行
复制
<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参数传递给小计函数,并在计算小计之前对数据执行筛选:

代码语言:javascript
运行
复制
$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;
   }

我已经用这段代码更新了我的演示。可以更改排序顺序,方法是将“日期”更改为“名称”或“价格”。

代码语言:javascript
运行
复制
$scope.orderBy = 'Date';

并确保小计自动重新计算。

票数 2
EN

Stack Overflow用户

发布于 2014-05-22 20:34:11

我不知道有什么办法能做到纯粹的角度,也许有人会插话。

你所需要的看起来像是一个累积的总和:

代码语言:javascript
运行
复制
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
}

然后将该字段添加到正在重复的对象数组中,然后将其显示在表中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23816341

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档