angularjs - 有条件地为表单组控件替代复选框选择
问题描述
我创建了一个名为 fruits 的表单组
fruits: FormGroup = formBuilder.group({
numberOfFruits: [0,Validators.min(0)],
apple: false,
mangoes: false
});
html如下:
<div formGroupName="fruits">
<div>
<p>Key in the number of fruits you want to select</p>
</div>
<div>
<input readonly matInput formControlName="numberOfFruits" type="number">
</div>
<mat-checkbox formControlName="apple">Apple</mat-checkbox>
<mat-checkbox formControlName="mangoes">Mangoes</mat-checkbox>
</div>
我想按如下方式执行验证:
- 如果选择了 0 个水果,则不允许选择任何(苹果/芒果)复选框。
- 如果为水果数量选择 1,则只允许/至少选择一个复选框(苹果/芒果)
- 如果为水果总数选择了 2 个或更多,则至少要选择 1 个复选框(苹果/芒果/两者)。
我fruits
通过编写如下个别条件为组创建了验证:
if (group.controls['numberOfFruits'].value === 1 || (group.controls['numberOfFruits'].value == 2 &&
group.controls['apple'].value === true)) {
group.controls['mangoes'].patchValue(false);
}
if (group.controls['numberOfFruits '].value == 1 || (group.controls['numberOfFruits'].value == 2 && group.controls['mangoes'].value === true)) {
group.controls['apple'].patchValue(false);
}
有没有更好更有效的方法来实现这一目标?
解决方案
我认为最好订阅 group.valueChanges(请记住,您需要在创建 formGroup后订阅)。有些喜欢
group.valuesChange.subscribe(res=>{
if (res.numberOfFuits>=1)
{
..enable apple and mangos..
if (res.numberOfFuits==1)
{
if apple, mangos=false; //<--remember {emitEvent:false}
if mangos, apple=false
}
}
else
{
disable apple and mangos and set value to false;
}
})
并且您需要自定义 formValidation 来控制 numberOfFruits>2 的时间
推荐阅读
- javascript - 使用横滚、俯仰、偏航和长度确定新的 GPS 位置
- c# - Unity 引擎:哪个组件称为运行脚本?
- rest - 将卷曲转换为放心
- ffmpeg - 如何使用 ffmpeg 缓存流
- r - 使用 dplyr 在数据框的第一个位置包含列
- wix - 如何仅在安装和修改时执行条件自定义操作?
- angular - 如何在 RxJS 6 和 Angular 6 出错后保持 observable 存活
- laravel - laravel migration 指定的key太长;最大密钥长度为 767 字节
- r - 如何使用 dplyr 创建总频率表
- xaml - 将控件模板与 Xamarin 表单选项卡式页面一起使用