【发布时间】:2016-05-18 14:56:41
【问题描述】:
我有一个带有“名称”控件的表单。
<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)
}))
});
【问题讨论】:
-
请参阅github.com/angular/angular/issues/6895,包括针对这种确切情况的完整解决方案。希望在 v4 中会添加与该票证相关的本机支持
标签: validation asynchronous angular