2017-07-11 37 views
2

我有一个动态表单数组,如果我点击添加联系人按钮,它会添加动态表单字段后,我试图验证表单字段(validator.required,validator.pattern等..)和它的工作正常。如何显示动态表单数组的md错误消息?

当我试图表明下面的错误消息,以html视图

<md-error *ngIf="myForm.controls.myContactArray.controls['name'].hasError('required')"> 
     Email is <strong>required</strong> 
    </md-error> 

得到下面的错误消息

core.es5.js:1020 ERROR TypeError: Cannot read property 'hasError' of undefined 
    at Object.eval [as updateDirectives] (RegisterComponent.ngfactory.js:453) 
    at Object.updateDirectives (core.es5.js:12770) 
    at checkAndUpdateView (core.es5.js:12288) 
    at callViewAction (core.es5.js:12651) 
    at execEmbeddedViewsAction (core.es5.js:12609) 
    at checkAndUpdateView (core.es5.js:12289) 
    at callViewAction (core.es5.js:12651) 
    at execComponentViewsAction (core.es5.js:12583) 
    at checkAndUpdateView (core.es5.js:12294) 
    at callViewAction (core.es5.js:12651) 

HTML

<div class="container-fluid"> 
    <md-card> 
    <button (click)="addColumn()" md-raised-button>Add Contacts</button> 
    <hr> 
     <form [formGroup] = "myForm" (ngSubmit) = "save(myForm.value)" class="contact-form"> 
     <div formArrayName="myContactArray"> 
      <div *ngFor="let myGroup of myForm.controls.myContactArray.controls; let rowIndex = index" > 
      <div [formGroupName]="rowIndex" class="make-rel"> 
       <div class="make-abs">Row {{rowIndex + 1 }}</div> <!--rowIndex - Index num of newly created form--> 
        <button *ngIf="myForm.controls.myContactArray.controls.length" 
        (click)="removeColumn(rowIndex)" class="make-abs removeRow" md-mini-fab><md-icon>close</md-icon></button> 
       <div [formGroupName]="myGroupName[rowIndex]"> 
       <div class="row"> 
        <div class="col-md-2 col-md-offset-1"> 
        <div class="form-group"> 
         <md-input-container class="example-full-width"> 
         <input mdInput placeholder="Name" formControlName ="name"> 
          <md-error *ngIf="myForm.controls.myContactArray.controls['name'].hasError('required')"> 
     Email is <strong>required</strong> 
    </md-error> 

         </md-input-container> 
         </div> 
        </div> 
        <div class="col-md-2"> 
         <div class="form-group"> 
         <md-input-container class="example-full-width"> 
          <input mdInput placeholder="Email ID" formControlName ="email"> 


          </md-input-container> 
         </div> 
         </div> 
         <div class="col-md-2"> 
         <div class="form-group"> 
          <md-input-container class="example-full-width"> 
          <input mdInput placeholder="City" formControlName ="city"> 
          </md-input-container> 
          </div> 
         </div> 
         <div class="col-md-2"> 
         <div class="form-group"> 
          <md-input-container class="example-full-width"> 
          <input mdInput placeholder="Phone" formControlName ="phone"> 
          </md-input-container> 
          </div> 
         </div> 
         <div class="col-md-2"> 
         <div class="form-group"> 
          <md-input-container class="example-full-width"> 
          <input mdInput placeholder="Mobile" formControlName ="mobile"> 
          </md-input-container> 
          </div> 
         </div> 
         </div> 
        </div> 
         <hr> 
        </div> 
       </div> 
       </div> 
       <button md-raised-button type="submit" *ngIf="myForm.controls.myContactArray.controls.length > 0" [disabled] = "!myForm.valid">Submit</button> 

      </form> 
      </md-card> 
     </div> 

打字稿

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

const EMAIL_REGEX = /^(([^<>()[\]\\.,;:\[email protected]\"]+(\.[^<>()[\]\\.,;:\[email protected]\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; 
const mobile = /06([0-9]{8})/; 

@Component({ 
    moduleId: module.id, 
    selector: 'app-register', 
    templateUrl: './register.component.html', 
    styleUrls: ['./register.component.css'] 
}) 


export class RegisterComponent implements OnInit { 
    public myForm: FormGroup; 

    myGroupName = ['firstForm']; 
    newName: string = "dynamicRow"; 
    newColumnName: string; 

    constructor(private _FormBuilder: FormBuilder) { } 

    ngOnInit() { 

     this.myForm = this._FormBuilder.group({ 

      myContactArray: this._FormBuilder.array([ 
       this._FormBuilder.group({ 

        firstForm: this._FormBuilder.group({ 
         formName: ['firstForm'], 
         name: ['', Validators.compose([Validators.required, Validators.minLength(3)])], 
         email: ['', Validators.compose([Validators.required, Validators.pattern(EMAIL_REGEX)])], 
         city: ['', Validators.compose([Validators.required])], 
         phone: ['', Validators.compose([Validators.required])], 
         mobile: ['', Validators.compose([Validators.required,Validators.minLength(10), Validators.maxLength(10), Validators.pattern(mobile)])], 
        }) 

       }), 

      ]) 

     }); 
    } 


    insertIntoArray(columnName: any) { 

     return this._FormBuilder.group({ 
      [columnName]: this._FormBuilder.group({ 
       formName: [columnName], 
       name: ['', Validators.compose([Validators.required, Validators.minLength(3)])], 
       email: ['', Validators.compose([Validators.required, Validators.pattern(EMAIL_REGEX)])], 
       city: ['', Validators.compose([Validators.required])], 
       phone: ['', Validators.compose([Validators.required])], 
       mobile: ['', Validators.compose([Validators.required,Validators.minLength(10), Validators.maxLength(10), Validators.pattern(mobile)])], 


      }) 

     }) 

    } 


    randonFormName() { 
     var newColumnName = ""; 
     const alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; 
     for (var i = 0; i < 5; i++) 
      newColumnName += alpha.charAt(Math.floor(Math.random() * alpha.length)); 
     return newColumnName; 

    } 


    addColumn() { 
     this.newColumnName = this.randonFormName(); 
     const control = <FormArray>this.myForm.controls['myContactArray']; 
     this.myGroupName.push(this.newColumnName); 
     control.push(this.insertIntoArray(this.newColumnName)); 
     console.log(control); 
    } 



    removeColumn(i: number) { 
     const control = <FormArray>this.myForm.controls['myContactArray']; 
     control.removeAt(i); 
     this.myGroupName.splice(i, 1); 
    } 

    save(value: any) { 
     console.log(value) 
    } 


} 

回答

3
从您的评论

所以,我理解你一次只想显示一条错误消息。

但是,情况是,您需要指定要应用验证错误的表单组。随着

myForm.controls.myContactArray.controls['name'].hasError('required') 

您要指向一个表单控件name形式阵中,而不是一个表单组内的任何具体形式的控制。

所以这里是你如何做到这一点。使用myGroup您为formarray中的每个表单组命名,然后在该组内部有一个嵌套表单组,即myGroupName[rowIndex]。所以,你的验证错误看起来是这样的:

<md-error *ngIf="!myGroup.controls[myGroupName[rowIndex]].hasError('minlength', 'name')"> 
    Name is required 
</md-error> 
+0

太棒了它运行良好。谢谢。 –

+0

非常欢迎,很高兴听到它的工作! :) – Alex

1

使用

*ngIf="myForm.hasError('required', 'name')" 

我最近有一个奇怪的错误,所以如果你有一个参数错误,请尝试使用试试这个

*ngIf="myForm.hasError('required', ['name'])" 
+0

错误消息显示与[隐藏],但错误没有显示正确,我有两个错误消息validators.required和validators.minlength两者在一个单一的时间显示,然后如果在textbox validators中键入任何内容。当我修复validators.minlength输入时,需要隐藏的消息应该不会隐藏,然后两者将同时隐藏。 –

+0

那么你必须做出自己的条件,在这里想一下,我只给你正确的语法。 – trichetriche

+0

我尝试了很多方法,但无法修复。请建议任何解决方案。 –