我的情况是我需要format
用户输入,然后是validate
它。
我正在使用reactive form
并创建了我的custom validation
,如下所示(相关部分):
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>
控制器:
this.form = this.formBuilder.group({
'invoiceNumber': ['', validateInvoiceNumber()],
});
formatRoNumber() {
var invoiceNumber = this.form.controls['invoiceNumber'].value;
//format invoice number
}
验证
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 } }
};
}
我遇到时间问题。输入的格式化在验证后发生。
如何告诉Angular
应用formatting
然后validate
?
答案 0 :(得分:1)
如果您还使用ngModel进行格式化,则可以使用formbuilder执行此操作。我已经完成了它
<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) ])]
});
(ngModelChange)将在验证像往常一样触发时激活管道。如果您编写自定义管道,也可以允许进行其他验证。
答案 1 :(得分:0)
由于某种原因,Caleb的方式对我不起作用,并且验证器被调用两次。
如果它对任何人有帮助,我最终都是这样做的。必须有一个更好的方法,setValidators似乎很奇怪,应用它们,然后将它们删除以进行下一次更新......但这样可行。
谢谢Caleb和Deborah的帮助。
控制:
<input type="text" formControlName="invoiceNumber" (blur)="updateAndValidateInvoiceNumber()" class="form-control">
控制器:
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();
}
答案 2 :(得分:0)
在您的formgroup
中,为该formControl
添加以下模式:
-variable_name: ['', [Validators.pattern(/^[.\d]{1,15}$/)]]