用其他控制器计算ng-repeat中的行总数

时间:2014-06-20 08:53:30

标签: angularjs angularjs-scope angularjs-ng-repeat

我得到的行将计算总数。

在我的ng-repeat中,我有一个控制器RowCtrl,我计算总数。

app.controller('RowCtrl', function ($scope) {
   $scope.unit_price = 0;
   $scope.quantity = 0;

   $scope.$watchCollection('[row.unit_price, row.quantity]', function () {
      $scope.row.total = $scope.row.unit_price * $scope.row.quantity;
   });
});

如何计算所有行的总数?

在fiddlr中,我有一个行的演示,其中已经计算了一行的总数。

Fiddlr:http://jsfiddle.net/9t9em/1/

2 个答案:

答案 0 :(得分:3)

你不需要RowCtrl

http://jsfiddle.net/9t9em/5/

app.controller('MainCtrl', function ($scope) {
    $scope.rows = [{
        unit_price: 1,
        quantity: 0
    }, {
        unit_price: 2,
        quantity: 0
    }, {
        unit_price: 3,
        quantity: 0
    }];
    $scope.$watch('rows', function () {
        $scope.total = 0
        angular.forEach($scope.rows, function(row){
            $scope.total += row.unit_price * row.quantity
        })
    }, true)
});

答案 1 :(得分:0)

是的,有可能 - 只需使用objectEquality参数(检查子元素是否有变化):

$scope.$watch('rows', function () {...}, true);

但更好 - 只需在模板中执行:

{{unit_price * quantity | number:2}}

这样会更有效率,而且不易出错。


为什么它应该在视野中?

因为它是视图逻辑..我的意思是:它是关于:如何显示某一行。

是否可以将此逻辑用于查看?

在简单乘法的情况下(如本例所示) - 我认为,没关系。但在更复杂的情况下,最好为此添加特殊过滤器。

为什么它会比深度观察和总计重新计算更有效率?

因为这个重新计算将在每一行中的每个可能的变化上被调用,并且将重新计算所有总数(不是所需的总数)。但是如果你在视图中这样做 - angular只会观察某些行中的某些属性,所以只有在需要时才会重新计算总数。