angular - 如何使用响应式表单验证禁用的控件(不触发验证)
问题描述
假设我有这个表单结构:
this.entryForm = this.formBuilder.group({
date: [{value:'' , disabled: true}, [Validators.required]],
notes: [''],
sum_credit: [{value:'', disabled: true }],
sum_debit: [{value:'', disabled: true}],
items: this.initItems()
});
// set validation function to sum_credit
this.entryForm.controls['sum_credit'].setValidators([CommonValidations.validateSomthing(...)]);
被sum_credit
禁用,因为它的值总是被计算出来的。现在我需要验证sum_credit
是否等于sum_debit
,并且我已经在使用validateSomthing
函数执行此操作。问题是validateSomthing
没有触发,因为控件被禁用。我该如何解决?
谢谢
解决方案
Angular 不会触发禁用字段的验证器。解决此问题的一种方法是将验证器应用于组而不是控件(这将触发验证器每次更新到对应组内的任何、未禁用的表单控件:
this.entryForm = this.formBuilder.group({
date: [{value:'' , disabled: true}, [Validators.required]],
notes: [''],
sum_credit: [{value:'', disabled: true }],
sum_debit: [{value:'', disabled: true}],
items: this.initItems()
}, { validator: CommonValidations.validateSomthing(...) });
请注意,您需要调整验证器函数以从 sum_debit 控件读取值:
validateFn(group: AbstractControl) {
const control = group.get('sum_debit');
// here you can validate control.value;
}
推荐阅读
- python - 过滤表单的 Django 用户选择字段使用
- java - JTextField - 在 n 秒内未编辑后调用事件
- firebase - Flutter:关于数据更改的 Firebase 推送通知
- sorting - 在多列中唯一的 shell 脚本中排序
- python - 计算提取的 TensorFlow 子图中包含“while_loop”的梯度
- ruby-on-rails - 为什么这个 Rails ajax 在第一次请求时会部分刷新,但在后续请求中不会?
- ios - UITextChecker 告诉我完全荒谬的事情没有拼写错误
- java - CountdownTimer 未在 Runnable 中运行
- c# - 在 web.config 中添加第三个端点显示错误
- bash - Docker 启动容器进程导致“exec:\”arg\”:在 $PATH 中找不到可执行文件”:未知。