我有一个“名称”控件的窗体。如何在Angular2的debounce时间之后触发验证输入?
<div class="field">
<label>Name</label>
<input ngControl="name">
<p *ngIf="name.pending">
Fetching data from the server...
</p>
<div *ngIf="!name.valid && !name.pending"
class="ui error message">Name is not valid</div>
</div>
控制与FormBuilder建这样的:
this.name = fb.control('', null, this.characterNameValidator.bind(this));
和我创建了一个验证:
characterNameValidator(control: Control) {
let q = new Promise((resolve, reject) => {
setTimeout(() => {
if (this._characterService.isCharacterNameAlreadyExists(control.value)) {
resolve({nameCharacterAlreadyExistsError: true});
} else {
resolve(null);
}
}, 1000)
});
return q;
}
在每次击键,我的验证程序被调用。我正在寻找一种只有在去抖时间后才能调用验证器的方法。
我尝试使用valueChanges(),但我只有在我调用特定服务时才理解,但在验证的情况下不能。
编辑
是它来管理验证手动实现我的问题是一个好主意?我不会在我的控件中添加验证器,但是我在valueChanges上手动设置了错误。
this.name = fb.control('');
this.name.valueChanges.debounceTime(400).subscribe(() => {
this.characterNameValidator(this.name).then((validationResult => {
this.name.setErrors(validationResult)
}))
});
貌似为http://stackoverflow.com/questions/33799600/general-asynchonious-validation-in-angular2 –
见https://github.com/angular/angular/issues/6895同样的要求包括针对此确切场景的完整解决方案。希望在第4版中会添加与该票相关的本机支持 –