将自定义验证动态删除到Angular 2中

将自定义验证动态删除到Angular 2中,angular,validation,Angular,Validation,如果选中复选框,我希望设置所需输入。验证工作 很好,但当我取消选中复选框时,我会删除必需的 验证。但表单无效,保存按钮未启用 这是我的表单生成器 这里是自定义验证器函数 我也试过了 提前谢谢。有什么想法请帮助我。尝试调用updateValueAndValidity{onlySelf:false,emitEvent:false} 这是它的签名: 更新: 事实并非如此,我们一起在plunk中所做的最终是订阅复选框的更改事件,并相应地禁用/启用输入字段。如果禁用了所需的验证器,它将被排除在验证之外,

如果选中复选框,我希望设置所需输入。验证工作 很好,但当我取消选中复选框时,我会删除必需的 验证。但表单无效,保存按钮未启用

这是我的表单生成器

这里是自定义验证器函数

我也试过了

提前谢谢。有什么想法请帮助我。

尝试调用updateValueAndValidity{onlySelf:false,emitEvent:false}

这是它的签名:

更新:

事实并非如此,我们一起在plunk中所做的最终是订阅复选框的更改事件,并相应地禁用/启用输入字段。如果禁用了所需的验证器,它将被排除在验证之外,这比删除验证器要好。

尝试调用updateValueAndValidity{onlySelf:false,emitEvent:false}

这是它的签名:

更新:


事实并非如此,我们一起在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;