我得到的行将计算总数。
在我的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/
答案 0 :(得分:3)
你不需要RowCtrl
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只会观察某些行中的某些属性,所以只有在需要时才会重新计算总数。