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:
“这些状态是互斥的,所以控制不能同时有效,无效或无效且禁用。“
和
“禁用控制是从验证检查豁免和不包含在它们的祖先的控制的总价值”。
因此,禁用控件应自动删除验证并将控件标记为有效。
答
如果(类型)检查不起作用,但我也发现没有必要删除并重新添加验证,我可以禁用并重新启用该控件。所以解决办法是:
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();
};
}
没有足够的信息来重现问题。代码在这里看起来很好。也许创造一个展示问题的闯入者? – Alex
它是否正在执行此逻辑的适当分支? – DeborahK
你试过这个:'this.category_type.clearValidators();' – DeborahK