Обдумывал это в течение полдня.Наконец-то нашли решение вышесказанного.All value manipulations directly from html are often discouraged as these don't qualify as good code practices.
Тем не менее, я реализовал решение следующим образом.Добавьте следующее в component.ts
.
data : Array<number> = [1,2,3,4,5];
sum : Array<number> = [0];
Добавьте следующий код в component.html
<table>
<tbody>
<ng-container *ngIf="{sample : sum} as variable">
<tr *ngFor="let a of data;let index of index">
<td>{{a}}</td>
<td><input type='text' #i [ngModel]="a"/></td>
<td>{{i.value*a}}</td>
<td style="display:none;">{{variable.sample[index] = variable.sample[index-1]+i.value*a}}</td>
</tr>
<tr>
<td></td>
<td></td>
<td>Sum={{variable.sample[5]}}</td>
</tr>
</ng-container>
</tbody>
</table>
В основном я использовал Array<number>
с именем sum
, которыйбудет держать сумму во время каждой итерации ngFor
.Я рассчитываю то же самое, используя expression
внутри последнего td
и {{variable.sample[index] = variable.sample[index-1]+i.value*a}}
.Для каждой итерации цикла переменная sample
обновляется с новой суммой.Для любого change
значения input
значение переменной sample
также изменяется, и это отражается как итоговое значение.
Надеюсь, это поможет.A nice and challenging question it is, I must say!
.
--- EDIT1 ---
Дело не удалось в случае непоследовательных номеров.По сути, let a of data;let index of index
имеет два условия цикла.В условных обозначениях условие оценивается как <tr ngFor let-index="$implicit" ngFor let-a="$implicit" [ngForOf]="data">
, что преобразует index
и a
в неявные переменные для цикла над data
, что означает index === a
.Я исправил то же, что и ниже.Следующий код работает нормально для всех случаев:
<table>
<tbody>
<ng-container *ngIf="{sample : sum} as variable">
<tr *ngFor="let a of data;let in=index">
<td>{{a}}</td>
<td><input type='text' #i [ngModel]="a"/></td>
<td>{{i.value*a}}</td>
<td style="display:none;">{{variable.sample[in+1] =variable.sample[in]+ i.value*a}}</td>
</tr>
<tr>
<td></td>
<td></td>
<td>SUM={{variable.sample[data.length]}}</td>
</tr>
</ng-container>
</tbody>
</table>