我创建了一个带有嵌套表单组的表单:
this.cardForm = this.fb.group({
number: ['', Validators.compose([Validators.required, this.validateCardNumber])],
holderName: ['', Validators.required],
expiry: this.fb.group({
expirationMonth: ['', Validators.required],
expirationYear: ['', Validators.required],
}, this.validateCardExpiry),
cvc: ['', Validators.required]
});
进入我的模板:
<form [formGroup]="cardForm" novalidate="novalidate" (ngSubmit)="onSave()">
<div class="form-group" formGroupName="expiry">
<label for="expirationmonth">Expiration month</label>
<select2 id="default-select"
name="expirationmonth"
formControlName="expirationMonth"
[data]="months$ | async"
[width]="250"
[options]="select2Options">
</select2>
<label for="expirationyear">Expiration year</label>
<select2 id="default-select2"
name="expirationyear"
formControlName="expirationYear"
[data]="years$ | async"
[width]="250"
[options]="select2Options">
</select2>
</div>
</form>
select2
是来自ng2-select2的组件。
Angular正在给我这个消息:
错误:没有带路径的表单控件的值访问器:&#39;到期 - &gt; expirationMonth&#39;
答案 0 :(得分:1)
这似乎是表单的问题,正如GitHub issues
所示所以你现在必须为此做一些解决方法。根据上一篇关于该问题的评论,您可以尝试已经完成的工作:
我花了一些时间来弄清楚使用反应形式。我所要做的只是实现实现ControlValueAccessor并在select / unselect上传播来自ngAfterViewInit的更改。
使用您的代码,我发现的另一种解决方法是在选择上使用ngDefaultControl
。
<select2 ngDefaultControl ..... ></select2>
但是这会引发问题,当你进行更改时,它不会反映在表单值中。因此,当值发生变化时,快速解决此问题的方法是patchValue
。这可能不太好,但有效。
使用ng2-select2的更改事件的模板:
(valueChanged)="changed($event)"
要修补其中一个值的组件:
changed(e) { // e is of primitive type here
this.cardForm.controls['expiry'].controls['expirationMonth'].patchValue(e)
}
答案 1 :(得分:0)
尝试将ngControlDefault
添加到<div>
。
<div class="form-group" formGroupName="expiry" ngControlDefault>