如何在angularJs中对ng-repeat列表中的下一行进行算术计算并保留结果?

问题描述:

我有一个表,我想在每一行中进行加/减,并保留下一行的结果。如何在angularJs中对ng-repeat列表中的下一行进行算术计算并保留结果?

<tr ng-repeat="statement in statements.result.data"> 
    <td>{{statement|getClosingBalance:statements.opening_balance|number:2}}</td> 
</tr> 

过滤器,

invoiceApp.filter('getClosingBalance', function() { 
return function (statement, balance) { 
    if (statement.type == 1) { 
     return parseFloat(balance) + parseFloat(statement.amount); 
    } else if (statement.type == 2) { 
     return parseFloat(balance) - parseFloat(statement.amount); 
    } 
} 
}); 

这是工作的罚款,因为我写的代码, 但我想每一个操作之后保持平衡。

我该如何执行相同的操作?

+0

你可以创建plunker? – Shohel

+1

这个过滤器对于这个目的没有任何意义。过滤器旨在用于返回数组的子集,或以特定格式呈现数据值。它们不打算用于执行功能应用程序逻辑。 – Claies

+0

好的,那么解决方案是什么:( – gsk

为什么不计算服务中的数据,并保持清洁。计算服务中的数据,然后直接渲染数据,这使得您的视图更加清洁,服务易于测试。

app.factory('openingBalanceService', function() { 

    function calculateOpeningBalance(data){ 
     var result = angular.copy(data); 
     /*do calculation on result*/ 
     return result 
    } 

    return{ 
     calculateOpeningBalance: calculateOpeningBalance 
    }; 

    }); 
+0

我也可以在服务中做,但是会有两种方式绑定。每当函数值更新时,每一行都会更新。 – gsk

+0

因此,您希望每当行更新时更新摘要数据? – Sean

时,从数据库或API接收到的数据,我做所有的计算在控制器本身,

$scope.statements.balance = $scope.statements.opening_balance; 
        angular.forEach($scope.statements.result.data, function (obj) { 
         if (obj.type == 1) { 
          obj.closing_balance = parseFloat($scope.statements.balance) + parseFloat(obj.amount) 
         } else if (obj.type == 2) { 
          obj.closing_balance = parseFloat($scope.statements.balance) - parseFloat(obj.amount) 
         } 
         $scope.statements.balance = obj.closing_balance; 
        }); 

的Html,

<td class="text-right" data-ng-bind="(company.currency)+' '+(statement.closing_balance|number:2)"></td> 

所以不会有任何种类的HTML calcuaiton的或内循环:)

+0

我倾向于保持这些逻辑的服务,保持控制器尽可能薄,但它看起来像确定:) – Sean