【问题标题】:How to apply required validation for checkbox using dynamically如何动态使用复选框应用所需的验证
【发布时间】:2019-08-14 03:48:16
【问题描述】:

我正在使用以下JSON 设置dynamic form validation。基于这些JSON,我使用以下JSON 格式创建了动态表单字段。

fields = [ { type: 'text', name: 'firstName', label: 'First Name', value: '', required: true, }, { type: 'checkbox', name: 'hobby', label: 'Hobby', required: true, options: [ { key: 'f', label: 'Fishing' }, { key: 'c', label: 'Cooking' } ] } ]

我的commponent.ts 文件正在关注

form: FormGroup;

ngOnInit() {
  let fieldsCtrls = {};
    for (let f of this.fields) {
      if (f.type != 'checkbox') {
        fieldsCtrls[f.name] = new FormControl(f.value || '', 
          Validators.required)
      } else {
        let opts = {};
        for (let opt of f.options) {
          opts[opt.key] = new FormControl(opt.value);
        }
       fieldsCtrls[f.name] = new FormGroup(opts)
     }
   }
   this.form = new FormGroup(fieldsCtrls);
}  

我已为所有输入字段应用required 验证,不包括checkbox

如何在此代码中为复选框应用所需的验证?

【问题讨论】:

  • 你可以在opts[opt.key] = new FormControl(opt.value);之后使用setValidators([Validators.required])。或者你可以使用前面的命令new FormControl(opt.value, Validators.required)
  • 你还需要在FormControl上使用updateValueAndValidity()
  • 您首先必须向我们解释需要复选框的含义。选项为 false 且未选中复选框,或者为 true 且选中复选框。需要是什么意思?
  • required:true时需要选中1个复选框
  • 您好 Niladri 我无法理解您的建议。我想如果我尝试过这个,那么它会为每个复选框应用验证。我只想在提交表单时至少选中 1 个复选框

标签: angular


【解决方案1】:

Bhagwat,你在选项中没有“价值”。你需要决定你想得到什么。您的代码创建了一个为您提供值的 FormGroup,例如

{firsName:"firstName",hobby:{f:true,c:false}}

但你可以得到一些喜欢

{firsName:"firstName",hobby:[true,false]}

或者

{firsName:"firstName",hobby:['f']}

在所有情况下,您都需要创建一个 customValidator,并且您需要决定如何显示表单。对于第一种情况,您在 formGroup 上创建验证器

 //when you create the formGroup of options
 fieldsCtrls[f.name] = new FormGroup(opts,this.oneRequiredValidator())

//I decided create the validator in the own component
oneRequiredValidator() {
    return (formGroup) => {
      if (!formGroup)
        return null;
      let oneChecked = false;
      for (let key in formGroup.value)
        oneChecked = oneChecked || formGroup.value[key]
      return oneChecked ? null : { error: 'one required' }
    }
  }

关于最后一个选项(返回一个数组)我前段时间做了一个自定义组件,见answer in stackblitz

【讨论】:

  • 嗨@Eliseo 我已经在我的应用程序中实现了它但没有工作
猜你喜欢
  • 2018-01-06
  • 1970-01-01
  • 2011-06-29
  • 1970-01-01
  • 1970-01-01
  • 2021-01-17
  • 2021-08-03
  • 2021-10-05
  • 2017-05-18
相关资源
最近更新 更多