How to use debounceTime in an angular component?

前端 未结 2 1146
深忆病人
深忆病人 2020-12-19 12:30

My requirement is to perform reactive form field validations in such a way that the error messages are displayed only after the user stops typing.

How can I accompli

2条回答
  •  清歌不尽
    2020-12-19 12:50

    The (or at least a) way to get this to work is to dynamically remove and add your validators as you go.

    On your input(s), use a keydown binding that will strip away validators when the user starts to type, and a keyup binding that will run through a debounceTime pipe and then reapply the validators (but only after the specified debounce time has passed).

    Code here:

    import { Component, OnInit } from '@angular/core';
    import { FormBuilder, FormGroup, Validators } from '@angular/forms';
    import { Subject } from 'rxjs';
    import { debounceTime } from 'rxjs/operators';
    
    @Component({
      selector: 'form-component',
      template: `
        
    `, styles: [ '.invalid { border-color: red; color: red; }' ] }) export class FormComponent implements OnInit { formGroup: FormGroup; subject: Subject = new Subject(); constructor(private formBuilder: FormBuilder) {} ngOnInit(): void { this.formGroup = this.formBuilder.group({ name: [ '' ] }); // Subscribe to the subject, which is triggered with each keyup // When the debounce time has passed, we add a validator and update the form control to check validity this.subject .pipe(debounceTime(500)) .subscribe(() => { this.formGroup.controls.name.setValidators([ Validators.minLength(5) ]); this.formGroup.controls.name.updateValueAndValidity(); } ); } onKeyUp(): void { this.subject.next(); } onKeyDown(): void { // When the user starts to type, remove the validator this.formGroup.controls.name.clearValidators(); } }

    And StackBlitz here: https://stackblitz.com/edit/debounce-validator

提交回复
热议问题