我有一个表,其中有许多行是由ngFor循环生成的。 当用户单击一行或一组行时,这些行将被推送到一个新数组中,并且可以一次进行编辑。我想添加重置功能,允许用户将行重置为默认设置。我遇到的问题是重置功能正在重置整个表。如何将特定行传递给reset方法,以便仅重置该特定行?
下面是相关代码。 // HTML
<div
*ngIf="!!modal"
class="modal__mask">
<section
*ngIf="!!modal"
class="modal modal__large"
[formGroup]="tableForm">
<div class="modal__header modal__header--large">
<h6>Edit Employee Details</h6>
<div class='u-flex u-alignCenter'>
<i
class="icon icon--medium icon--pointer"
(click)="previousSelectedRow()">
arrow_left
</i>
<p *ngIf="selectedRows.length > 0">{{modalPage + 1}} of {{selectedRows.length}} employees</p>
<i
class="icon icon--medium icon--pointer"
(click)="nextSelectedRow()">
arrow_right
</i>
</div>
</div>
<section>
<div
class="u-flex u-wrap"
*ngFor='let row of selectedRows; let i = index'>
<div
class="u-flex modal__body"
style="width: 50%"
*ngFor="let column of columns">
<div
*ngIf="column.label"
class="input__wrapper"
[ngClass]="{'input__wrapper--inline': layout === 'horizontal'}">
<div>
<label
class="input__label">
<p class="t-bold t-data">{{column.label}}</p>
</label>
<div class="z-input__default">
<input
class="input u-maxX"
[attr.type]=""
[attr.placeholder]=""
[formControlName]="column.key"
[value]="row[column.key]">
</div>
</div>
</div>
</div>
<section class="modal__footer u-fillRemaining">
<div class="u-flex">
<button
class="button button--medium"
(click)="nextSelectedRow()">
<div class="button__content">
<i
class="icon icon--medium"
*ngIf="!!icon">
{{icon}}
</i>
<span>Skip</span>
</div>
</button>
</div>
<div class="u-flex">
<button
class="button button--low"
(click)="reset(row)">
<div class="button__content">
<i
class="icon icon--medium"
*ngIf="!!icon">
{{icon}}
</i>
<span>Reset</span>
</div>
</button>
<button class="button button--low">
<div class="button__content">
<i
class="icon icon--medium"
*ngIf="!!icon">
{{icon}}
</i>
<span>Save Changes</span>
</div>
</button>
</div>
</section>
</div>
</section>
</section>
// TS
ngOnInit() {
if (!!this.rows) {
this.tableForm = new FormGroup({});
this.rows.forEach(row => {
this.columns.forEach(column => {
this.tableForm.addControl(column.key, new FormControl(row[column.key]));
});
})
}
}
reset(row) {
let resetRow = row;
this.tableForm.reset(resetRow) // this resets the entire table
}
答案 0 :(得分:3)
现在基本上您的控件是一个接一个的,因此您不能仅区分与特定行相关的控件,您可以做的是将每行的控件包装到FormGroup中并将此FormGroup添加到父FormArray中因此该行的索引将是其键。然后,您可以使用该索引找到所需行的FormGroup进行重置。
this.tableForm = new FormArray([]);
this.rows.forEach((row, i) => {
const rowGroup = new FormGroup({});
this.columns.forEach(column => {
this.rowGroup.addControl(column.key, new FormControl(row[column.key]));
});
this.tableForm.push(rowGroup);
})
...
<section
*ngIf="!!modal"
class="modal modal__large"
[formArray]="tableForm">
...
<div
class="u-flex u-wrap"
*ngFor='let row of selectedRows; let i = index'
[formGroupName]="i">
...
<button
class="button button--low"
(click)="reset(i)">
....
reset(i) {
this.tableForm.at(i).reset();
}
希望有帮助。