如何在 angular 组件中使用 debounceTime?
How to use debounceTime in an angular component?
我的要求是以仅在用户停止输入后才显示错误消息的方式执行反应式表单字段验证。
如何使用响应式表单和 Rxjs debounceTime 来完成此操作?
我正在寻找适用于 Reactive 表单的解决方案
使它起作用的(或至少一种)方法是动态删除和添加您的验证器。
在您的输入上,使用一个 keydown
绑定,它会在用户开始输入时去除验证器,以及一个 keyup
绑定,它会 运行 通过 debounceTime管道然后重新应用验证器(但仅在指定的去抖动时间过去后)。
代码在这里:
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: `
<form [formGroup]="formGroup">
<input type="text" formControlName="name" (keyup)="onKeyUp()" (keydown)="onKeyDown()" [ngClass]="{ 'invalid': formGroup.controls.name.invalid }">
</form>
`,
styles: [
'.invalid { border-color: red; color: red; }'
]
})
export class FormComponent implements OnInit {
formGroup: FormGroup;
subject: Subject<any> = 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();
}
}
这里是 StackBlitz:https://stackblitz.com/edit/debounce-validator
debounceTime
等待提到的时间段,然后调用订阅方法。例如; debounceTime(1000)
将等待 1 秒。通过pipes
.
实现
这可以添加到任何订阅方法。以下是工作示例
import { Component, OnInit } from '@angular/core';
import { Validators, AbstractControl } from '@angular/forms';
import { debounceTime } from 'rxjs/operators';
// dynamic forms
import { FormGroup, FormControl, FormBuilder } from '@angular/forms';
@Component({
selector: 'app-customer-form',
templateUrl: './customer-form.component.html',
})
export class CustomerFormComponent implements OnInit {
emailMessage : string;
private validationMessages = {
required: "Email field is required",
email: "Please enter a valid Email"
}
customerForm: FormGroup;
customer = new Customer();
constructor(private fb: FormBuilder) { }
ngOnInit() {
this.customerForm = this.fb.group({
emailAddress: ['',
[
Validators.required,
Validators.email
]
]
})
const emailControl = this.customerForm.get('emailAddress');
emailControl.valueChanges.pipe( debounceTime(1000) ).subscribe(
value => this.setEmailMessage(emailControl)
)
}
setEmailMessage( c: AbstractControl ) : void {
this.emailMessage = '';
if ( (c.touched || c.dirty) && c.errors ) {
this.emailMessage = Object.keys(c.errors).map( key => this.validationMessages[key]).join(' ');
}
}
}
在您的模板中
<input
class="form-control"
id="emailId" type="email"
placeholder="Email (required)"
formControlName="emailAddress"
[ngClass]="{ 'is-invalid': emailMessage }"/>
<span class="invalid-feedback">
{{ emailMessage }}
</span>
我的要求是以仅在用户停止输入后才显示错误消息的方式执行反应式表单字段验证。
如何使用响应式表单和 Rxjs debounceTime 来完成此操作?
我正在寻找适用于 Reactive 表单的解决方案
使它起作用的(或至少一种)方法是动态删除和添加您的验证器。
在您的输入上,使用一个 keydown
绑定,它会在用户开始输入时去除验证器,以及一个 keyup
绑定,它会 运行 通过 debounceTime管道然后重新应用验证器(但仅在指定的去抖动时间过去后)。
代码在这里:
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: `
<form [formGroup]="formGroup">
<input type="text" formControlName="name" (keyup)="onKeyUp()" (keydown)="onKeyDown()" [ngClass]="{ 'invalid': formGroup.controls.name.invalid }">
</form>
`,
styles: [
'.invalid { border-color: red; color: red; }'
]
})
export class FormComponent implements OnInit {
formGroup: FormGroup;
subject: Subject<any> = 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();
}
}
这里是 StackBlitz:https://stackblitz.com/edit/debounce-validator
debounceTime
等待提到的时间段,然后调用订阅方法。例如; debounceTime(1000)
将等待 1 秒。通过pipes
.
这可以添加到任何订阅方法。以下是工作示例
import { Component, OnInit } from '@angular/core';
import { Validators, AbstractControl } from '@angular/forms';
import { debounceTime } from 'rxjs/operators';
// dynamic forms
import { FormGroup, FormControl, FormBuilder } from '@angular/forms';
@Component({
selector: 'app-customer-form',
templateUrl: './customer-form.component.html',
})
export class CustomerFormComponent implements OnInit {
emailMessage : string;
private validationMessages = {
required: "Email field is required",
email: "Please enter a valid Email"
}
customerForm: FormGroup;
customer = new Customer();
constructor(private fb: FormBuilder) { }
ngOnInit() {
this.customerForm = this.fb.group({
emailAddress: ['',
[
Validators.required,
Validators.email
]
]
})
const emailControl = this.customerForm.get('emailAddress');
emailControl.valueChanges.pipe( debounceTime(1000) ).subscribe(
value => this.setEmailMessage(emailControl)
)
}
setEmailMessage( c: AbstractControl ) : void {
this.emailMessage = '';
if ( (c.touched || c.dirty) && c.errors ) {
this.emailMessage = Object.keys(c.errors).map( key => this.validationMessages[key]).join(' ');
}
}
}
在您的模板中
<input
class="form-control"
id="emailId" type="email"
placeholder="Email (required)"
formControlName="emailAddress"
[ngClass]="{ 'is-invalid': emailMessage }"/>
<span class="invalid-feedback">
{{ emailMessage }}
</span>