【问题标题】:Ionic 3 formarray validate dynamic radio button groupsIonic 3 formarray 验证动态单选按钮组
【发布时间】:2019-03-31 04:23:27
【问题描述】:

我正在尝试验证从数组对象动态创建的单选按钮组,我希望它以我发布了一个寻求答案的问题的形式进行验证,但我没有得到澄清并再次进行了一些研究并发现了这个文章循序渐进,找到了formArrayName,但无法实现验证

<form[formGroup]="form">
  <ion-select formControlName="type">
    <ion-option value="1">Full Time</ion-option>
    <ion-option value="2">Part Time</ion-option>
  </ion-select>

  <div formArrayName="employee_details">
    <ion-row class="rows" *ngFor="let employee of employee;  let rowIndex = index">
      <ion-col text-center="text-center" col-6="col-6">
        [ {{employee.id}} ]
        <br> {{employee.name}}
      </ion-col>
      <ion-col class="rows last" col-6="col-6">
        <ion-list class="row" no-lines="no-lines" radio-group="radio-group">
          <ion-item col-4="col-4">
            <ion-radio class="radio " mode="md" value="Paid"></ion-radio>
          </ion-item>
          <ion-item col-4="col-4">
            <ion-radio class="radio " mode="md" value="Unpaid"></ion-radio>
          </ion-item>

        </ion-list>
      </ion-col>
    </ion-row>
  </div>

</form>

JS

import { FormBuilder, FormGroup, FormControl,FormArray, Validators } from '@angular/forms ';

class type {
  public name: string;
  public id: string;
}
...
class employee {
  public name: string;
  public id: string;
}
...
employee: employee = [{
  id: 1,
  name: "emp1"
}, {
  id: 2,
  name: "emp2"
}, {
  id: 3,
  name: "emp3"
}];
form: FormGroup;

this.form = new FormGroup({
  'type': new FormControl(null, [Validators.required]),
  'employee_details': new FormArray([])
});
Object.keys(this.employee).forEach(function(key, index) {
  console.log(key);
  // problem is here 
  const control = new FormControl(null, Validators.required);
  ( < FormArray > this.form.get('employee_details')).push(control);

});

【问题讨论】:

  • 我不太明白你想要在这里实现什么。你能解释一下它是什么吗?
  • 单选按钮组动态生成,我希望在表单提交时对其进行验证

标签: angular ionic-framework ionic3


【解决方案1】:

这不是formArray,但绝对能帮到你..

.html

<form [formGroup]="form">
<ion-row class="rows" *ngFor="let detail of details; let i = index">
    <ion-col text-center="text-center" col-6="col-6">
        {{your_data}}
    </ion-col>
    <ion-col class="rows last" col-6="col-6">
        <ion-list class="row" no-lines="no-lines" radio-group="radio-group" formControlName="action{{i}}">
            <ion-item col-4>
                <ion-radio class="radio true" mode="md" value="true"></ion-radio>
            </ion-item>
            <ion-item col-4>
                <ion-radio class="radio false" mode="md" value="false"></ion-radio>
            </ion-item>
            <ion-item col-4>
                <ion-radio class="radio " mode="md" value="not sure"></ion-radio>
            </ion-item>
        </ion-list>
    </ion-col>
</ion-row>
<button ion-button (click)="submit()" [disabled]="!form.valid">Submit</button>
</form>

.ts 在您获取数据的位置添加此代码。

let i;
for(i in this.details){
  this.form.setControl('action'+i, new FormControl('', Validators.required));
}

变量 'i' 只是用来产生 0,1,2,3 以添加控件名称。您可以使用自己的方式来执行此操作,但需要循环。

【讨论】:

  • 只是我添加null而不是''的小改动
  • 我兄弟上面有一个小问题,因为我今天吸收了第一次加载 setControl 时,当您更改并重新加载时,一切都很好,然后出现问题,因为它会创建另一组控制
  • 错误:没有 FormControl 实例附加到名称为“action0”的表单控件元素
【解决方案2】:

您可以简单地通过数组map,然后为每个元素创建一个FormControl

,而不是做你现在正在做的事情

试试这个:

this.form = new FormGroup({
  type: new FormControl(null, [Validators.required]),
  employee_details: new FormArray([this.employee.map(emp => new FormControl(null, Validators.required))])
});

【讨论】:

  • 你能解释一下我用名称变量 iam 对用 html 映射它有点困惑吗
  • 感谢更新我正在检查我是否必须在 html 中添加这个 [formControlName]="employee.id"
  • 错误:未捕获(承诺中):TypeError:无法读取未定义的属性“地图”
  • 感谢您的帮助,我有一个类似 this.fom 的问题在加载时加载到构造函数中,并且在选择更改时加载了数组,并且它也是在那时生成的,它只会起作用吗?
  • @Shaik,如果数组是在选择更改时生成的,那么它将不起作用,因为模板甚至会在此之前被渲染。首先,您将如何收到要更改的选项。
猜你喜欢
  • 2019-12-24
  • 2014-02-26
  • 1970-01-01
  • 1970-01-01
  • 2012-01-04
  • 2015-05-31
  • 2011-01-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多