我想输出一个字段,其中一个字段是一个数组,对于数组的每个元素,我都需要输出输入。
组件:
userData.contacts = [
{contact_type: "phone", value: "380666666666"},
{contact_type: "email", value: "ggg@gg.gg"},
{contact_type: "website", value: "www.good.co"}
];
this.contactInfoForm = new FormGroup ({
contacts: this.fb.array (userData.contacts)
});
HTML:
<form [formGroup] = "contactInfoForm" novalidate (ngSubmit) = "submit ('contactInfoForm')">
<div formArrayName = "contacts" * ngFor = "let contact of contactInfoForm.get ('contacts'). controls; let i = index;">
<div formGroupName = "i">
<label> {{contact.value.contact_type}} </ label>
<input formControlName = "value">
</ div>
</ div>
</ form>
如果要在控制台中推断出存在一个带有大量数据的对象的形式。
asyncValidator: null
controls:
contacts: FormArray
asyncValidator: null
controls: Array (3)
0: FormControl {validator: null, asyncValidator: null, _onCollectionChange: ƒ, pristine: true, touched: false, ...}
1: FormControl {validator: null, asyncValidator: null, _onCollectionChange: ƒ, pristine: true, touched: false, ...}
2: FormControl {validator: null, asyncValidator: null, _onCollectionChange: ƒ, pristine: true, touched: false, ...}
length: 3
__proto__: Array (0)
dirty: (...)
disabled: (...)
enabled: (...)
errors: null
invalid: (...)
length: (...)
parent: (...)
pending: (...)
pristine: true
root: (...)
status: DISABLED
statusChanges: EventEmitter {_isScalar: false, observers: Array (0), closed: false, isStopped: false, hasError: false, ...}
touched: false
untouched: (...)
updateOn: (...)
valid: (...)
validator: null
value: (3) [{...}, {...}, {...}]
valueChanges: EventEmitter {_isScalar: false, observers: Array (0), closed: false, isStopped: false, hasError: false, ...}
_onCollectionChange: ƒ ()
_onDisabledChange: []
_parent: FormGroup {validator: null, asyncValidator: null, _onCollectionChange: ƒ, pristine: true, touched: false, ...}
__proto__: AbstractControl
__proto__: Object
dirty: (...)
disabled: (...)
enabled: (...)
errors: null
invalid: (...)
parent: (...)
pending: (...)
pristine: true
root: (...)
status: DISABLED
statusChanges: EventEmitter {_isScalar: false, observers: Array (0), closed: false, isStopped: false, hasError: false, ...}
touched: false
untouched: (...)
updateOn: (...)
valid: (...)
validator: null
value: {contacts: Array (3)}
valueChanges: EventEmitter {_isScalar: false, observers: Array (0), closed: false, isStopped: false, hasError: false, ...}
_onCollectionChange: ƒ ()
_onDisabledChange: []
__proto__: AbstractControl
我试图以不同的方式得出信息。这是行不通的。即使愚蠢地复制粘贴了Internet中的示例文件。同样的问题。同样的错误。
错误:
Cannot find control with path: 'contacts -> 0 -> value'
也尝试过:
<input [formControlName]="contact.value.value">
错误:
联系人-> 0-> 380666666666
答案 0 :(得分:0)
您需要为联系人提供FormControl
元素数组,而不是普通数组。
const formControlArray = [];
userData.contacts.forEach(contact => {
formControlArray.push(new FormControl(contact.value));
})
this.contactInfoForm = new FormGroup ({
contacts: this.fb.array(formControlArray)
});
但是,我不确定FormArray是否适合您的用例,因为元素必须具有不同的名称。 您也可以通过这种方式动态添加控件:
this.contactInfoForm = new FormGroup({});
userData.contacts.forEach(contact => {
contactInfoForm.addControl(contact.contact_type, new FormControl(contact.value));
})
答案 1 :(得分:0)
组件:
userData.contacts = [{
contact_type: "phone",
value: "380666666666"
}, {
contact_type: "email",
value: "ggg@gg.gg"
}, {
contact_type: "website",
value: "www.good.co"
}];
this.contactInfoForm = new FormGroup({
contacts: this.fb.array([
...this.userData.contacts.map(({ contact_type, value }) => {
return this.fb.group({
contact_type,
value
});
})
])
});
HTML:
<form [formGroup]="contactInfoForm" novalidate (submit)="submit('contactInfoForm')">
<div formArrayName="contacts" *ngFor="let contact of contactInfoForm.get('contacts').controls; let i = index;">
<div [formGroupName]="i" >
<label>{{ contact.value.contact_type }}</label>
<input formControlName="value">
</div>
</div>
</form>
工作正常。但我仍然不喜欢使用地图方法。