angular - FormArray 在复选框更改事件上显示输入字段的默认值
问题描述
我有一个带有两个控件的 FormArray,selectItem 是一个复选框,SelectAmount 是一个输入文本字段。最初,我在输入字段中显示对象数组的默认值,当复选框被选中时,该字段是可编辑的。现在,如果我取消选中该复选框,那么我希望 Input 字段显示默认值,即 reversalAmount 属性,如代码所示。任何人都可以请帮助我。
<ul formArrayName="items">
<li class="reverse-list-item" *ngFor="let option of reversePaymentOptions ; let i=index" [formGroupName]="i">
<div class="select-all">
<mat-checkbox formControlName="selectItem" [(ngModel)]="reversePaymentOptions[i].isChecked" (change)="getSelectedItem(option)"></mat-checkbox>
</div>
<div class="reverse-amount-change" *ngIf="togglePartialReversalWithdrawal && option.PartialWithdrawEnabled">
<div class="form-control-wrapper">
<mat-form-field class="form-full-width">
<mat-label>GBP</mat-label>
<input type="text" matInput formControlName="selectAmount" (focus)="onfocusAmount(reversePaymentOptions[i])" [(ngModel)]="reversePaymentOptions[i].reversalAmount">
</mat-form-field>
</div>
</div>
</li>
</ul>
this.reversePaymentOptions = [
{
thumb: './assets/images/withdrawal/visa.svg.png',
name: 'Visa',
cardType: 'cc',
reversalAmount: 20.00,
isChecked: false,
PartialWithdrawEnabled: true
},
{
thumb: './assets/images/withdrawal/trustly.svg.png',
name: 'Trustly',
cardType: 'noncc',
reversalAmount: 20.00,
isChecked: false,
PartialWithdrawEnabled: false
},
{
thumb: './assets/images/withdrawal/paypal.svg',
name: 'Paypal',
cardType: 'wallet',
reversalAmount: 10.00,
isChecked: false,
PartialWithdrawEnabled: true
},
{
thumb: './assets/images/withdrawal/skrill.svg.png',
name: 'Skrill',
cardType: 'noncc',
reversalAmount: 40.00,
isChecked: false,
PartialWithdrawEnabled: true
},
{
thumb: './assets/images/withdrawal/maestro.svg.png',
name: 'Maestro',
cardType: 'noncc',
reversalAmount: 10.00,
isChecked: false,
PartialWithdrawEnabled: true
},
{
thumb: './assets/images/withdrawal/mastercard.svg.png',
name: 'Master Card',
cardType: 'noncc',
reversalAmount: 30.00,
isChecked: false,
PartialWithdrawEnabled: true
}
];
ngOnInit() {
this.form = this.formBuilder.group({
items: this.formBuilder.array([])
});
this.data();
this.getTotalAmount();
}
get formArr() {
return this.form.get('items') as FormArray;
}
this.reversePaymentOptions.map(d =>
this.formArr.push(this.formBuilder.group({
selectItem: new FormControl(d.isChecked),
selectAmount: new FormControl(d.reversalAmount, [Validators.required, Validators.min(1),
Validators.max(d.reversalAmount)])
}))
);
解决方案
由于您使用ngModel
的reversalAmount
值reversePaymentOptions
将被更改,因此您无法检索原始值。所以让我们首先通过删除所有来解决这个问题ngModel
(你不需要它)。请改用 Reactive Form 实现(您已经拥有)。
还要修改getSelectedItem()
HTML 中的 以传递控件索引和checked
状态:
<ul formArrayName="items">
<li class="reverse-list-item" *ngFor="let option of reversePaymentOptions ; let i=index" [formGroupName]="i">
<div class="select-all">
<mat-checkbox formControlName="selectItem" (change)="getSelectedItem(option, i, $event.checked)"></mat-checkbox> <-- Notice the extra parameters in getSelectedItem
</div>
<div class="reverse-amount-change" *ngIf="togglePartialReversalWithdrawal && option.PartialWithdrawEnabled">
<div class="form-control-wrapper">
<mat-form-field class="form-full-width">
<mat-label>GBP</mat-label>
<input type="text" matInput formControlName="selectAmount" (focus)="onfocusAmount(reversePaymentOptions[i])" >
</mat-form-field>
</div>
</div>
</li>
</ul>
如果由于某种原因,您需要reversePaymentOptions
对其reversalAmount
进行修改,请创建一个新的非引用数组副本(使用 lodash 之类的东西cloneDeep
)
在 TS 中,修改getSelectedItem
:
getSelectedItem(option, index, checked) {
...
if (!checked) {
this.formArr.controls[index].get('selectAmount').setValue(this.reversePaymentOptions[index].reversalAmount);
}
}
推荐阅读
- python - 有没有办法在该列的设定范围内找到特定列的最小值/最大值?
- java - BigQuery:从 CSV 加载到字节列
- r - R Data.Table 带权重
- webrtc - 如何计算 webrtc 的 TURN 服务器带宽?
- deep-learning - 使用 AlexeyAB 暗网训练自定义 yolov_3 时出现问题
- php - 大家好,请帮我解决下面 $ stock 变量的脚本问题
- r - 在 R 中寻找 SIR 模型参数的问题
- mysql - MySql Inner Join 抛出错误 - '字段列表'中的未知列'host.hostname'
- swift - Swift:使数字从右到左开始
- applescript - 使用 AppleScript 切换设置