Angular 以8的形式获得总计
我想得到每一行中输入的值,并得到这些行的总和 我的HTML:Angular 以8的形式获得总计,angular,typescript,angular-reactive-forms,Angular,Typescript,Angular Reactive Forms,我想得到每一行中输入的值,并得到这些行的总和 我的HTML: <ng-container formArrayName="cap_values"> <tbody *ngFor="let item of capValues.controls; let i=index" [formGroupName]="i"> <tr> <td class="freeze-first-col"><input type
<ng-container formArrayName="cap_values">
<tbody *ngFor="let item of capValues.controls; let i=index" [formGroupName]="i">
<tr>
<td class="freeze-first-col"><input type="text" (blur)="getName(item.value.name)" formControlName="name"></td>
<td><input type="number" formControlName="fdnTotalShares"</td>
</tr>
</tbody>
</ng-container>
如何迭代数组中的每个值并求和?我已经看到了
.valueChanges
,但不完全确定如何使用它。您可以通过表单控件进行循环
let total = 0;
form.controls.foreach(data => {
total += data.fdnTotalShares.value;
})
为了确保使用控制台日志获取正确的表单控件,有多种方法可以做到这一点,我将写下一些: 第一条路:
get capValues(): FormArray {
return this.form.get('cap_values') as FormArray;
}
getSum() {
this.sum = this.capValues.value.reduce((prev, next) => prev + +next.fdnTotalShares, 0);
// OR
// this.sum = this.capValues.getRawValue().reduce((prev, next) => prev + +next.fdnTotalShares, 0);
}
请注意,+
登录+next.fdnTotalShares
,这不是一个错误,它是为了确保您得到的是数字的总和(假设fdnTotalShares
始终是一个数字),而不是字符串连接
第二种方式:
this.sum = 0;
this.capValues.value.forEach(x => {
this.sum += +x.fdnTotalShares;
});
如果您有一些禁用的控件,并且希望将它们包括在计算中,则可以使用getRawValue()
而不是value
是一个stackblitz示例,演示了这一点(我还包括了启用
和禁用
控件的区别)
编辑:为了回答您在评论中的问题,这与我上面写的sum示例类似:
multiplyAndStore() {
const multiplicationRes = this.capValues.value.reduce((prev, next) => prev * +next.fdnTotalShares, 1);
// Assuming that "formControlName" for multiplication result input is 'multiplyResult'
this.form.get('multiplyResult').setValue(multiplicationRes);
// You can also use "patchValue" method instead of "setValue"
// this.form.get('multiplyResult').patchValue(multiplicationRes);
}
我已经更新了示例,以便您可以看到这一点
希望这有帮助。我已经试过了
使用可观察的
valueChanges
来实现这一点
在组件中,创建表单后,订阅表单数组cap\u values
中的valueChanges
从'rxjs'导入{Subscription};
总数:数字=0;
认购:认购;
恩戈尼尼特(){
//在这里创建您的表单
this.subscription=this.capValues.valueChanges.subscription(数据=>{
this.total=data.reduce((a,b)=>a++b.fdntottalshares,0)
});
}
获取capValues(){
将此.form.get('cap_values')作为FormArray返回;
}
现在,只要使用{{total}}
在模板中显示总计,它就会随着您更改fdntottalshares
输入中的值而动态更新
最后,不要忘记取消订阅valueChanges
。这就是为什么我引入了subscription
变量,如上面的代码片段所示
ngondestory(){
this.subscription.unsubscripte();
}
这里是一个简单的工作示例。您什么时候需要行的总和?@AbuTaha输入值后,我有一个
(keyup.enter)
函数是的,非常感谢!我还有一个问题。假设我有两个输入框。我想将这2的值乘以倍数,并将其显示在另一个框中。如何从乘法中检索值并使用它?这另一个文本框有一个FormControlName我已经更新了答案以包含此评论的答案。您可以按任意方式进行乘法(在本例中,我将数组中的值相乘),然后在另一个输入中设置该结果。您好,抱歉,只看到了您对我的评论的回答。我想乘以的两个值不是相同的FormControl
。它位于相同的FormArray
,但不同的FormControl
multiplyAndStore() {
const multiplicationRes = this.capValues.value.reduce((prev, next) => prev * +next.fdnTotalShares, 1);
// Assuming that "formControlName" for multiplication result input is 'multiplyResult'
this.form.get('multiplyResult').setValue(multiplicationRes);
// You can also use "patchValue" method instead of "setValue"
// this.form.get('multiplyResult').patchValue(multiplicationRes);
}
console.log(this.form.length);
console.log(this.form.value);