Angular2/4 - 反应形式,如何动态设置和清除所需的验证器

Angular2/4 - 反应形式,如何动态设置和清除所需的验证器

问题描述:

我有一个反应式,有两个选择下拉列表。根据第一个选择的值,第二个可能或可能不需要。Angular2/4 - 反应形式,如何动态设置和清除所需的验证器

这是在第一个值发生变化时触发的代码。它基本上搜索一个数组以查看它们是否匹配类型,如果它将它们分配给第二个下拉列表,则添加所需的验证程序。如果没有,则控制被禁用并且验证器被移除。

但是,该字段在else部分仍然是必需的,整个表单被标记为无效。那么缺少什么?

getCategoryTypes(value: string) { 
    let types = this.categories.find(v => v.name === value); 
    if (types) { 
     this.categoryTypes = types.category_types; 
     this.category_type.setValue(""); 
     this.category_type.setValidators([Validators.required]); 
     this.category_type.updateValueAndValidity(); 
    } 
    else { 
     this.categoryTypes = []; 
     this.category_type.setValidators(null); 
     this.category_type.updateValueAndValidity(); 
    }; 
    } 

据透露:

category_type: FormControl; 

UPDATE

在文档我发现this

“这些状态是互斥的,所以控制不能同时有效,无效或无效且禁用。“

“禁用控制是从验证检查豁免和不包含在它们的祖先的控制的总价值”。

因此,禁用控件应自动删除验证并将控件标记为有效。

+0

没有足够的信息来重现问题。代码在这里看起来很好。也许创造一个展示问题的闯入者? – Alex

+0

它是否正在执行此逻辑的适当分支? – DeborahK

+0

你试过这个:'this.category_type.clearValidators();' – DeborahK

如果(类型)检查不起作用,但我也发现没有必要删除并重新添加验证,我可以禁用并重新启用该控件。所以解决办法是:

getCategoryTypes(value: string) { 
    let types = this.categories.find(v => v.name === value).category_types; 
    if (types.length > 0) { 
     this.categoryTypes = types; 
     this.category_type.setValue(""); 
     this.category_type.enable(); 
     this.category_type.updateValueAndValidity(); 
    } 
    else { 
     this.categoryTypes = []; 
     this.category_type.disable(); 
     this.category_type.updateValueAndValidity(); 
    }; 
    }