将自定义验证动态删除到Angular 2中
如果选中复选框,我希望设置所需输入。验证工作 很好,但当我取消选中复选框时,我会删除必需的 验证。但表单无效,保存按钮未启用 这是我的表单生成器 这里是自定义验证器函数 我也试过了 提前谢谢。有什么想法请帮助我。尝试调用updateValueAndValidity{onlySelf:false,emitEvent:false} 这是它的签名: 更新: 事实并非如此,我们一起在plunk中所做的最终是订阅复选框的更改事件,并相应地禁用/启用输入字段。如果禁用了所需的验证器,它将被排除在验证之外,这比删除验证器要好。尝试调用updateValueAndValidity{onlySelf:false,emitEvent:false} 这是它的签名: 更新:将自定义验证动态删除到Angular 2中,angular,validation,Angular,Validation,如果选中复选框,我希望设置所需输入。验证工作 很好,但当我取消选中复选框时,我会删除必需的 验证。但表单无效,保存按钮未启用 这是我的表单生成器 这里是自定义验证器函数 我也试过了 提前谢谢。有什么想法请帮助我。尝试调用updateValueAndValidity{onlySelf:false,emitEvent:false} 这是它的签名: 更新: 事实并非如此,我们一起在plunk中所做的最终是订阅复选框的更改事件,并相应地禁用/启用输入字段。如果禁用了所需的验证器,它将被排除在验证之外,
事实并非如此,我们一起在plunk中所做的最终是订阅复选框的更改事件,并相应地禁用/启用输入字段。如果禁用了所需的验证器,它将被排除在验证之外,这比删除验证器要好。我看不出您需要自定义的有效字段首先,您可以依靠一个简单的更改事件: 在这里,我想通过使用变量来缩短组件中的表单控件,以便更容易使用它们,因为属性路径可能会变得很长。以下是两个控件: this.inputCtrl=this.filterperform.get'has\u not\u invested\u in \u days\u group.has\u not \u invested\u in \u days\u input' this.checkboxCtrl=this.filterperform.get'has\u not \u invested \u in \u days \u group.has\u not \u invested \u in \u days' 然后是复选框的更改事件: 正如Amit所提到的,您需要更新表单控件的值和有效性。下面是检查复选框状态并相应更新验证器的函数: 方格布尔{ 如果bool{ this.inputCtrl.setValidators[Validators.required] }否则{ this.inputCtrl.setvalidatorsnall } this.inputCtrl.updateValueAndValidity; } 这只是一个建议,也是我个人更喜欢的一个选择 但是,如果您更喜欢自定义验证器,那么继续使用Amit的答案,只需像建议的那样添加updateValueAndValidity
我不认为您需要自定义验证器,您可以只依赖一个简单的更改事件: 在这里,我想通过使用变量来缩短组件中的表单控件,以便更容易使用它们,因为属性路径可能会变得很长。以下是两个控件: this.inputCtrl=this.filterperform.get'has\u not\u invested\u in \u days\u group.has\u not \u invested\u in \u days\u input' this.checkboxCtrl=this.filterperform.get'has\u not \u invested \u in \u days \u group.has\u not \u invested \u in \u days' 然后是复选框的更改事件: 正如Amit所提到的,您需要更新表单控件的值和有效性。下面是检查复选框状态并相应更新验证器的函数: 方格布尔{ 如果bool{ this.inputCtrl.setValidators[Validators.required] }否则{ this.inputCtrl.setvalidatorsnall } this.inputCtrl.updateValueAndValidity; } 这只是一个建议,也是我个人更喜欢的一个选择 但是,如果您更喜欢自定义验证器,那么继续使用Amit的答案,只需像建议的那样添加updateValueAndValidity
只需调用控件。get'has_not_visited_in_days_input'。updateValueAndValidity{onlySelf:false,emitEvent:false};可能还有其他东西仍然无效?一旦我在输入中添加值并取消选中,那么表单是有效的,可能会发布一个plunk?让我们。只需调用control.get'has_not_visited_in_in_input'。UpdateValidity{onlySelf:false,emitEvent:false};可能还有其他东西仍然无效?一旦我向输入中添加值并取消选中,那么表单是否有效可能会发布一个plunk?让我们一起来。我通过plunk等帮助他聊天,这就是我们最终所做的,但我们完全跳过了设置和清除验证器,禁用和启用控件最终是一个更合适的解决方案,因为无论如何,完全跳过了该字段的验证。最佳解决方案;我通过plunks等帮助他聊天,这就是我们最终所做的,但我们完全跳过了设置和清除验证程序,禁用和启用控件最终成为更合适的解决方案,因为它完全跳过了该字段的验证。最佳解决方案离子;
this.filterForm = this.formBuilder.group(
{
has_not_visited_in_days_group: this.formBuilder.group({
has_not_visited_in_days: [false],
has_not_visited_in_days_input: [''],
}, {validator: this.requiredIfHasNotVisitedChecked}),
});
requiredIfHasNotVisitedChecked(control: AbstractControl): void {
const input = control.get('has_not_visited_in_days_input').value;
const inputCheckbox = control.get('has_not_visited_in_days').value;
control.get('has_not_visited_in_days_input').setValidators([]);
if (inputCheckbox) {
if (input === '' || input === null) {
control.get('has_not_visited_in_days_input').setValidators([Validators.required]);
}else {
control.get('has_not_visited_in_days_input').setValidators([]);
}
}else{
control.get('has_not_visited_in_days_input').setValidators([]);
}
}
control.get('has_not_visited_in_days_input').setValidators(null);
updateValueAndValidity({onlySelf, emitEvent}?: {
onlySelf?: boolean;
emitEvent?: boolean;
}): void;