angular - 如何在角度组件中使用 debounceTime?
问题描述
我的要求是以仅在用户停止键入后才显示错误消息的方式执行反应式表单字段验证。
我如何使用响应式表单和 Rxjs debounceTime 来实现这一点?
我正在寻找一种适用于反应式表单的解决方案
解决方案
让它工作的(或至少一种)方法是在你去的时候动态地删除和添加你的验证器。
在您的输入中,使用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
推荐阅读
- sql - 将 2 个选择查询合二为一
- elixir - 如何在 Elixir 的编译时指定模块实现?
- java - 无法构建 Appium 服务器,因为它无法找到 NodeInCurrentFileSystem
- git - git 在依赖于未合并分支的小分支上工作
- python - 将一段持续时间分成几行,最多不超过 24 小时
- algorithm - 什么是平凡和非平凡的启发式?
- vue.js - Vutify 列表组使父级可点击
- python - 通过 tags_metadata 字典定义 FastApi 中标签的顺序
- android - Android - Serivce 中的 SpeechRecognizer - 错误 9 但我拥有所有权限
- excel - 如何删除数据透视表excel的重复值?