2017-04-18 3 views
2

Ich habe eine Situation, wo ich format die Benutzereingabe und dann validate es brauchen.Angular 2: benutzerdefinierte Form Validierung mit Eingabeformatierung

Ich verwende einen reactive form und erstellt meine custom validation wie unten (relevanten Teile) gesehen:

HTML:

<input type="text" formControlName="invoiceNumber" (blur)="formatInvoiceNumber()" class="form-control"> 
<div *ngIf="this.form.controls['invoiceNumber'].invalid && this.form.controls['invoiceNumber'].touched">Invalid Text</div> 

Controller:

this.form = this.formBuilder.group({ 
      'invoiceNumber': ['', validateInvoiceNumber()], 
     }); 

    formatRoNumber() { 
      var invoiceNumber = this.form.controls['invoiceNumber'].value; 
      //format invoice number 
     } 

Validator:

export function validateInvoiceNumber(): ValidatorFn { 
    return (control: AbstractControl): { [key: string]: any } => { 
     let invoiceNumber = control.value, 
      isValid = true; 

     //validate invoice number 
     return isValid ? null : { validInvoiceNumber: { valid: false } } 
    }; 
} 

Ich komme in Timing-Probleme. Die Formatierung der Eingabe erfolgt nach der Validierung. Wie kann ich Angular anweisen, die formatting und dann validate anzuwenden

+1

Sieht aus wie Sie auf Blur formatieren ... so, wenn der Benutzer das Feld verlässt. Standardmäßig erfolgt die Validierung bei der Eingabe durch den Benutzer. Sie möchten also, dass es validiert wird, wenn der Benutzer das Feld verlässt? Ziehen Sie dann in Betracht, die integrierte Validierung nicht zu verwenden (sie nicht im FormBuilder anzugeben) und stattdessen sie direkt aufzurufen. Wenn Sie möchten, dass es nach der Formatierung auftritt, können Sie es von formatInvoiceNumber() aufrufen. – DeborahK

+0

@DeborahK, ich verstehe. Ich hatte gehofft, dass es eine Möglichkeit gibt, dies mit FormBuilder zu erledigen ... oder die Formatierung auf andere Weise auszuführen. Danke – Thibs

+0

Wenn Sie während der Eingabe formatieren möchten, können Sie eine Überwachung für valueChanges und format/validation hinzufügen. – DeborahK

Antwort

1

Sie können dies mit Formbuilder tun, wenn Sie auch ngModel verwenden, um zu formatieren. Ich habe es erreicht, wie so

<ion-input 
formControlName="fullName" 
type="text" 
[ngModel]="fullName | pipeHere" 
(ngModelChange)="fullName=$event"> 
</ion-input> 

this.customerFields = this.fb.group({ 
    fullName: ['', Validators.compose([ Validators.required, Validators.minLength(11) ])] 
}); 

die (ngModelChange) sein wird, was feuert die Pfeife in die Tat umzusetzen, während die Validierung Feuer wie üblich. Wenn Sie eine benutzerdefinierte Pipe schreiben, können Sie auch eine zusätzliche Validierung zulassen.

0

Calebs Weg funktioniert aus irgendeinem Grund nicht, und der Validator wird doppelt aufgerufen.

Wenn es jemand hilft, habe ich es so gemacht. Es muss einen besseren Weg geben, es scheint merkwürdig, die Validatoren zu setzen, sie anzuwenden und sie dann für die nächsten Updates zu entfernen ... aber das funktioniert.

Danke Caleb und Deborah für Sie helfen.

Steuerung:

<input type="text" formControlName="invoiceNumber" (blur)="updateAndValidateInvoiceNumber()" class="form-control"> 

Controller:

updateAndValidateInvoiceNumber(): void { 
    let control: AbstractControl = this.form.controls['invoiceNumber']; 
    let newVal = this.invoiceFormatterPipe.transform(control.value); 

    control.patchValue(newVal); 
    control.setValidators(validateInvoiceNumber()); 
    control.updateValueAndValidity(); 
    control.clearValidators(); 
} 
Verwandte Themen