Angular2:嵌套表单

时间:2017-04-04 11:42:40

标签: angular

我创建了一个带有嵌套表单组的表单:

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;

2 个答案:

答案 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>