2017-07-11 62 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

我嘗試了很多方法,但無法修復。請建議任何解決方案。 –