我的应用程序中有一个Angular反应形式,该形式利用FormArray在表单中存储值对。
OnInit,应用程序调用一个端点并返回存储在数据库中的一些值对,然后使用这些预先存在的值填充FormArray,以便在它们开始添加更多值之前向用户显示它们与表格配对。
FormArray会正确更新,如果我使用getRawValue
记录FormGroup的值,我可以看到列表中的元素具有端点返回的值。因此,我的FormArray中的第一个元素具有其对的值。
窗体本身利用FormArray,以便用户可以根据需要添加或删除尽可能多的值对。因为数组的第一个元素已经填充了一个值对,所以用户看到的物理形式包含一对用于存储值的输入。但是,这些输入未使用存储在FormArray中的值填充。
即使FormArray包含数据,这似乎也要进行更新以显示输入元素,但不显示正在呈现的这些输入中的值。
我尝试使用setValue
和patchValue
方法,但似乎无法正常工作。我尝试使用它会产生TypeError: Cannot read property 'setValue' of null
错误。
我需要怎么做才能更新表单中的输入,以便它们显示FormArray中包含的值?
组件
export class SettingsComponent implements OnInit, OnDestroy {
ipRangeForm: FormGroup;
constructor(
private formBuilder: FormBuilder, private settingsService: SettingsService
) {
super(baseService);
}
ngOnInit() {
this.ipRangeForm = this.formBuilder.group(
{
ipRanges: this.formBuilder.array([])
}
);
const stream = this.settingsService.getSettings();
stream.subscribe(val => {
this.ipRestrictionEnabled = val.ipRestrictionEnabled;
for (const i of val.ipRanges) {
console.log(i.startRange, i.endRange);
console.log(this.ipRangeForm);
this.addSpecifiedRange(i.startRange, i.endRange);
this.ipRangeForm.controls['ipRanges'].get('startingRange').setValue(i.startRange); //This doesn't update anything, it actually produces a TypeError
}
});
}
getPageConfig() {
return {
pageKey: 'settings',
displaySidebar: true,
displayToolbar: true,
backButtonRoute: ''
};
}
get ipRangeForms() {
return this.ipRangeForm.get('ipRanges') as FormArray;
}
addSpecifiedRange(startRange: string, endRange: string) {
const ipRange = this.formBuilder.group({
startingRange: [startRange],
endingRange: [endRange]
});
this.ipRangeForms.push(ipRange);
console.log(this.ipRangeForms.getRawValue());
}
}
带有表单的模板
<form [formGroup]="ipRangeForm">
<div formArrayName="ipRanges">
<div *ngFor="let ranges of ipRangeForms.controls; let i=index" [formGroupName]="i">
<div class="row mb-lg">
<div class="col-6">
<mat-card>
<div class="row">
<div class="col-5">
<mat-form-field style="width: 100%;">
<label>
<input matInput value="" formControlName="startingRange"> <!-- These Inputs do not update to display the data held inside the form array -->
</label>
</mat-form-field>
</div>
<div class="col-5">
<mat-form-field style="width: 100%;">
<label>
<input matInput value="" formControlName="endingRange"> <!-- These Inputs do not update to display the data held inside the form array -->
</label>
</mat-form-field>
</div>
<div class="col-2 remove-column">
<button swui-core-button (click)="deleteRange(i)" class="mr-sm pd-zero"
color="secondary" buttonStyle="link">
{{ getTranslateKey('remove') | translate }}
</button>
</div>
</div>
</mat-card>
</div>
</div>
</div>
</div>
</form>