2017-02-19 56 views
2

我使用的是角2.4,需要使用“FormArray”制作动态表单,但HTML根本不能识别我的数组。 我有这样的错误: 造成的:无法找到名称对照: '0'如何在角度使用FormArray 2.4

TS文件:

import { Component } from '@angular/core'; 
import { FormGroup, FormControl, Validators, FormArray } from '@angular/forms'; 

@Component({ 
    selector: 'my-formstwo', 
    templateUrl: "app/fromstesttwo/fromstesttwo.component.html", 
}) 
export class FromstesttwoComponent { 

    myForm: FormGroup; 
    constructor(){ 
     this.myForm = new FormGroup({ 
      'dataforms': new FormGroup({ 
       'username': new FormControl('sh', [Validators.required,Validators.minLength(3)]), 
       'email': new FormControl('', 
        [ 
         Validators.required, 
         Validators.pattern("[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?") 
        ]) 
       }), 
      'password': new FormControl('', Validators.required), 
      'gender': new FormControl('Fmale',Validators.required), 
      'hobys': new FormArray([ 
       new FormControl('SF') 
      ]) 
     }); 
    } 
    get hobyss(): FormArray { return this.myForm.get('hobys') as FormArray; } 
    addHobys() { 
    this.hobyss.push(new FormControl()); 
    } 
    genders:Array<string> = [ 
     'Male', 
     'Fmale' 
    ] 
    onSubmit(){ 
     console.log(this.myForm); 
    } 
} 

HTML文件:

<div class="clearfix"> </div> 
<p> </p> 
<form [formGroup]="myForm" (ngSubmit)="onSubmit()"> 
<div formGroupName="dataforms"> 
<div class="form-group"> 
    <label for="exampleInputEmail1">Username</label> 
    <input 
     type="username" 
     class="form-control" 
     id="exampleInputEmail1" 
     placeholder="Username" 
     formControlName="username"> 
    </div> 

    <div class="form-group"> 
    <label for="exampleInputEmail1">Email address</label> 
    <input 
     type="email" 
     class="form-control" 
     id="exampleInputEmail1" 
     placeholder="Email" 
     formControlName="email"> 
     <div *ngIf="!myForm.controls.dataforms.controls.email.valid"> 
     email inValid 
     </div> 
    </div> 
</div> 


    <div class="form-group"> 
    <label for="exampleInputPassword1">Password</label> 
    <input 
     type="password" 
     class="form-control" 
     id="exampleInputPassword1" 
     placeholder="Password" 
     formControlName="password"> 
    </div> 

    <div class="form-group"> 
    <div class="radiobottom" *ngFor="let g of genders"> 
     <input type="radio" name="gender" [value]="g" formControlName="gender"> 
     {{g}} 
    </div> 
    </div> 


    <div FormArrayName="hobys"> 
    <div class="form-group" *ngFor="let h of myForm.controls.hobys.controls; let i=index"> 
    <p> </p> 
     <input 
      type="text" 
      class="form-control" 
      formControlName="{{ i }}"> 
    </div> 
    </div> 

    <button type="button" class="btn btn-primary" (click)="addHobys()">Hoby</button> 
    <button type="submit" class="btn btn-default" [disabled]="!myForm.valid">Submit</button> 


</form> 

我的错误控制台:

EXCEPTION: Error in app/fromstesttwo/fromstesttwo.component.html:53:10 caused by: Cannot find control with name: '0' 

回答

2

问题是它的formArrayName,n OT FormArrayName

<div formArrayName="hobys"> 
    <div class="form-group" *ngFor="let h of myForm.controls.hobys.controls; let i = index"> 
    <p></p> 
    <input type="text" class="form-control" formControlName="{{i}}"> 
    </div> 
</div> 

奖励:

至于小费,你可以创建一个在您组件,下面为您controls引用:

export class FromstesttwoComponent { 

    myForm: FormGroup; 
    usernameCtrl: FormControl; 
    emailCtrl: FormControl; 
    passwordCtrl: FormControl; 
    genderCtrl: FormControl; 
    hobbiesCtrl: FormControl; 
    dataFormsCtrl: FormGroup; 
    hobbiesCtrl: FormArray; 

    constructor() { 
    this.usernameCtrl = new FormControl('sh', [Validators.required,Validators.minLength(3)]); 
    this.emailCtrl = new FormControl('', 
     [ 
      Validators.required, 
      Validators.pattern("[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?") 
     ] 
    ); 
    this.passwordCtrl = new FormControl('', Validators.required); 
    this.genderCtrl = new FormControl('Fmale',Validators.required); 
    this.hobbiesCtrl = new FormArray([new FormControl('SF')]); 

    this.dataFormsCtrl = new FormGroup({ 
     'username': this.usernameCtrl, 
     'email': this.emailCtrl 
    }); 

    this.myForm = new FormGroup({ 
     'dataforms': this.dataFormsCtrl, 
     'password': this.passwordCtrl, 
     'gender': this.genderCtrl, 
     'hobys': this.hobbiesCtrl 
    }); 
    } 
} 

为什么?

这样做,你就不需要使用得到或任何访问controls,你就可以直接在你的模板如下访问此,:

相反的:

<div *ngIf="!myForm.controls.dataforms.controls.email.valid"> 
... 
<div class="form-group" *ngFor="let h of myForm.controls.hobys.controls; let i=index"> 

此:

<div *ngIf="emailCtrl.invalid"> 
... 
<div class="form-group" *ngFor="let h of hobbiesCtrl.controls; let i=index"> 
0

你有这个formArrayName =“何改变这种formArrayName = ”hobys“ bys“(小写)

and this formControlControlName =”{{i}}“in this [formControlName] =”i“