2017-02-12 4 views
8

У меня есть данные инициативой форма в angular2, как показано нижеКак проверить длину FormArray в angular2

this.formBuilder.group({ 
    'name': ['',Validators.required], 
    'description': ['', Validators.required], 
    'places': this.formBuilder.array([], Validators.minlength(1)) 
}) 

Я хочу добавить валидации к place formArray, поэтому я добавляю minlength проверки, но проверка MinLength не работает на formArray.

Каковы другие проверки для formArray, так что форма должна быть действительной только тогда, когда массив объектов содержит по крайней мере одно место.

+0

Царапины, который должен work https://github.com/angular/angular/commit/7383e4a8012962430e8925b57554089cf92173cc –

+0

Вы также можете быть заинтересованы в этом https://github.com/angular/angular/commit/17c5fa9293bbfc30625c139caccad15ee883a0e3 в любом случае это должно работать, убедитесь, что у вас есть обновленная версия –

ответ

2

если вы пытаетесь добавить проверку, чтобы formarray попробовать это может помочь вам,

this.formBuilder.group({ 
    'name': ['',Validators.required], 
    'description': ['', Validators.required], 
    'places': this.formBuilder.array(this.initPlaces()) 
}) 

initPlaces() {  
     return this._fb.group({ 
      places: ['',[Validators.minLength(1)]]   
     }); 
    } 

этого initPlaces просто вернет formGroup с проверкой в ​​соответствии с требованием.

5

потому, что вы используете неправильное имя функции валидатор: minlength ->minLength

демо-код:

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

@Component({ 
    selector: 'app-root', 
    template: ` 
    <form novalidate [formGroup]="tpForm" (ngSubmit)="onSubmit()"> 
     <div><input type="text" formControlName="name"></div> 
     <div><textarea formControlName="description"></textarea></div> 
     <div formArrayName="places"> 
     <button type="button" (click)="addPlace()">+</button> 
     <div *ngFor="let place of places.controls; let i = index"> 
      <div> 
       <span>Places {{i + 1}}</span> 
       <button type="button" *ngIf="places.controls.length > 0" 
        (click)="removePlace(i)"> 
        x 
       </button> 
      </div> 
      <input type="text" [formControlName]="i"> 
     </div> 
     </div> 
     <button type="submit">Submit</button> 
    </form> 

    <p>Status: {{ tpForm.valid }}</p> 
    `, 
    styles: [ 
    ` 


    ` 
    ] 
}) 
export class AppComponent implements OnInit { 
    tpForm: FormGroup; 

    constructor(private fb: FormBuilder) {} 

    ngOnInit() { 
    this.tpForm = this.fb.group({ 
     'name': ['',Validators.required], 
     'description': ['', Validators.required], 
     'places': this.fb.array([ 
     this.fb.control('') 
     ], Validators.minLength(1)) 
    }) 
    } 

    get places(): FormArray { 
    return this.tpForm.get('places') as FormArray; 
    } 

    onSubmit() { 

    } 

    addPlace() { 
    this.places.push(this.fb.control('')); 
    } 

    removePlace(index) { 
    this.places.removeAt(index); 
    } 

} 

Plunker: https://plnkr.co/edit/cfi7nN?p=preview

11

Добавить пользовательский валидатор к службе проверки:

minLengthArray(min: number) { 
    return (c: AbstractControl): {[key: string]: any} => { 
     if (c.value.length >= min) 
      return null; 

     return { 'minLengthArray': {valid: false }}; 
    } 
} 

An d, то при создании формы выполните следующие действия:

this.formBuilder.group({ 
    'name': ['',Validators.required], 
    'description': ['', Validators.required], 
    'places': this.formBuilder.array([], this.validationService.minLengthArray(1)) 
}); 

И вы можете проверить ошибки против FormArray путем проверки FormArray.hasError('minLengthArray')

+0

Эй, это действительно работает:) - Но как я могу сделать это «пузыриться» до формы - предотвратить подачу (это не для меня)? – T4NK3R

+0

Вы используете бутстрап? Вот пример:

И у меня это в моем ts: this.form = this._fb.group ({ файлов: this._fb.array ([], this._vs.minLengthArray (1)) }); – user1779362

+0

Хорошо, что бы это сработало, но я надеялся, что смогу сделать этот пользовательский валидатор, автоматически, «повлиять» на форму (в), поэтому мне не нужно явно проверять действительность formArrays - точно так же, в валидаторах .. И теперь, кажется, он делает именно это - не знаю, почему это не вчера: D – T4NK3R

2

Validators.required сделать магию для вас

this.formGroup = this.formBuilder.group({ 
     taskTreeId: [Common.UID()], 
     executionProgrammedTime: ["", [Validators.required]], 
     description: [""], 
     tasks: this.formBuilder.array([], Validators.required) 
}); 

<button type="button" class="btn btn-success btn-rounded" [disabled]="!formGroup.valid">SAVE</button>