【发布时间】:2019-10-01 14:18:40
【问题描述】:
我正在使用 Angular 8.3.4 做一个 Web 应用程序。我有一个使用反应式表单的表单,我想添加异步验证以确保输入的名称是唯一的。我已经阅读了很多示例,但由于某种原因不适用于我。
服务
export class BrandService {
brands: Observable<BrandId[]>;
}
组件
export class CreateNewComponent {
form: FormGroup;
constructor(
private formBuilder: FormBuilder,
private brandService: BrandService
) {
// Creates a form group
this.form = this.formBuilder.group({
name: ['', Validators.compose([
Validators.required,
Validators.minLength(6),
CustomValidator.unique(this.brandService.brands)
])]
});
}
}
自定义验证器
export class CustomValidator {
static unique(brands: Observable<BrandId[]>) {
return (control: AbstractControl) => {
const name = control.value.toLowerCase();
return brands.pipe(
map(items => items.filter(b => b.name.toLowerCase() === name)),
map(items => items.length ? {unique: false} : null)
);
};
}
}
我将服务的 Observable 从组件传递给 CustomValidator。现在,控件有:status: "INVALID"
顺便说一句,我应该在我的unique 方法中显式返回什么?
我的目标是知道该名称是否已经存在于 Observable 的数组中以返回控制错误。
【问题讨论】:
-
异步验证器必须实现 AsyncValidator,参见angular.io/guide/…。注意:你总是可以在提交调用到你的 observable 并显示一条消息它不是唯一的
标签: angular angular-reactive-forms