Angular 5 只对模糊进行验证?

Angular 5 solely validation on blur?

我想知道是否可以在 blur 上以反应形式进行验证。目前您可以设置 updateOn: "blur" 但输入字段的值不会在输入时更新。在我的例子中,我需要在每次击键时更新值,因为我用它进行计算并将结果显示给用户。验证应该只在模糊时发生。

谢谢。

编辑:

我使用 FormBuilder,一些内置验证器和一些自定义验证器。示例代码:

let formToMake = {
  purpose: [null, Validators.required],
  registrationDate: this.fb.group({
    day: [null, Validators.required],
    month: [null, Validators.required],
    year: [null, Validators.required]
  }),
  isTruth: [null, Validators.compose([checkIfTrue, Validators.required])]
};

如果我要使用模糊事件,我需要手动完成所有验证,我认为这不是一个好方法。

我相信您正在寻找 Angular 元素上的 ng-binding。例如,您可以像这样为输入字段绑定到击键和模糊:

<input type=text (blur)="validate()" (keypress)="eventHandler($event)">

eventHandler(event) {
   console.log(event, event.keyCode, event.keyIdentifier);
   // Update value of string on every keystroke
} 

validate() {
   // Validation code goes here
}

您也可以使用 ngModel,这样您就完全不必担心击键问题,因为字符串会自动为您更新。它看起来像这样:

<input [(ngModel)]="name" (blur)="validate()">

name: string;

validate() {
   // Validation code goes here
}

由于您正在考虑使用 Reactive Forms 模块及其验证,您可以这样做:

模板方法

<input [(ngModel)]="lastname" [ngModelOptions]="{ updateOn: 'blur' }">

ngModel 绑定会在每次击键时更改输入,因此您不必手动进行。我真的建议采用这种方法,因为这是您目前要求做的。

响应式表单方法

this.nameForm = new FormGroup ({
  firstname: new FormControl('', {
    validators: Validators.required,
    updateOn: 'submit'
  }),
  lastname: new FormControl('', {
    validators: Validators.required,
    updateOn: 'submit'
  })
});

参考文献:SO Approach Medium Article

updateOn 只是一个 属性 访问器方法。输入 HTML 标记有一个名为 blur 的事件绑定,可用于方便。

URL 到官方文档。 https://angular.io/guide/user-input#on-blur

我最终做了什么:

使用反应形式:

TS

这是要制作的表格。我需要在 blur 上验证 productCost 和 loanAmount,但值本身需要更新 onchange。如果您设置 updateOn: "blur" 验证发生在模糊事件之后,但值也会在模糊事件之后更新。

let formToMake = {
      productCost: new FormControl(null, {validators: Validators.required, updateOn: "blur"}),
      loanAmount: new FormControl(null, {validators: Validators.compose([Validators.required, Validators.min(2500)]), updateOn: "blur"}),
      loanLength: new FormControl(49, {validators: Validators.required, updateOn: "change"})
    };

处理输入法:

为了解决这个问题,我制作了一个事件处理程序,它将在输入事件时被调用。

TS

handleInput(e: any) {
    this.loanAmount = e;
  }

HTML

<input class="form__input" type="number" value="{{loanForm.get('loanAmount').value}}" id="loanAmount" formControlName="loanAmount" (input)="handleInput($event.target.value)">