ng-repeat ループ内の関数の出力にバインドしたいという問題が発生しています。関数が、期待どおりに 1 回ではなく、アイテムごとに 2 回呼び出されていることがわかりました。ng-repeat セクションは次のとおりです (最後の calcRowTotal() 呼び出しに注意してください)。
<tr ng-repeat="row in timesheetRows">
<td>
<select ng-model="row.categoryID">
<option ng-repeat="category in categories" value="{{category.id}}">
{{category.title}}
</option>
</select>
</td>
<td ng-repeat="day in row.dayValues">
<input type="text" ng-model="day.hours" />
</td>
<td>{{calcRowTotal($index, row)}}</td>
</tr>
calcRowTotal() 関数を次に示します。
$scope.calcRowTotal = function (index, row) {
console.log('calcRowTotal - Index: ' + index);
var total = 0;
for (var i = 0; i < row.dayValues.length; i++) {
var num = parseFloat(row.dayValues[i].hours);
if (isNaN(num)) {
num = 0;
//this.dayValues[i].hours = 0;
}
total += num;
}
//updateDayTotals();
return total;
}
反復される項目の 1 つの例を次に示します。
{
categoryID: 2,
dayValues: [
{ day: $scope.days[0], hours: 5 },
{ day: $scope.days[1], hours: 0 },
{ day: $scope.days[2], hours: 3 },
{ day: $scope.days[3], hours: 0 },
{ day: $scope.days[4], hours: 2 },
{ day: $scope.days[5], hours: 5 },
{ day: $scope.days[6], hours: 8 }
]
}
コンソールに次のように表示されます (現在、ループしているコレクションに 2 つのアイテムがあります)。
calcRowTotal - Index: 0
calcRowTotal - Index: 1
calcRowTotal - Index: 0
calcRowTotal - Index: 1
確かに「rowTotal」プロパティを作成できますが、上記の関数によって提供される「ライブ」データにバインドすることをお勧めします。うまくいけば、重複は私が見逃している単純なものなので、なぜ重複が見られるのかについてのフィードバックをいただければ幸いです。補足として、テキスト ボックスの 1 つのデータが変更されると、行の合計も更新する必要があるため、別のアプローチが必要になる場合があります。ただし、この特定の状況を最初に理解することに興味があります....潜在的に多くの行が存在する可能性があるため、間違いなく重複は望ましくありません。
例を次に示します: http://jsfiddle.net/dwahlin/Y7XbY/2/