通过包含* ngFor

时间:2017-06-01 13:24:59

标签: angular ionic2 angular-reactive-forms

在Ionic 2中,我试图创建一个动态表单,它将显示一个切换按钮列表。

为此,我尝试使用FormArray并依赖Angular文档,主要依据此post

基于此,我实现了以下

<form *ngIf="accountForm" [formGroup]="accountForm">

    <ion-list>

      <!-- Personal info -->
      <ion-list-header padding-top>
        Informations personnelles
      </ion-list-header>
      <ion-item>
        <ion-label stacked>Prénom</ion-label>
        <ion-input formControlName="firstname" [value]="(user | async)?.info.firstname" type="text"></ion-input>
      </ion-item>

      <!-- Sport info -->
      <ion-list-header padding-top>
        Mes préférences sportives
      </ion-list-header>
      <ion-list formArrayName="sports">

        <ion-item *ngFor="let sport of accountForm.controls.sports.controls; let i = index" [formGroupName]="i">
          <ion-label>{{sport.name | hashtag}}</ion-label>
          <ion-toggle formControlName="{{sport.name}}"></ion-toggle>
        </ion-item>

      </ion-list>

    </ion-list>


  </form>

控制器

ionViewDidLoad() {
    console.log('MyAccountPage#ionViewDidLoad');

    // Retrieve the whole sport list
    this.sportList$ = this.dbService.getSportList();
    this.sportList$.subscribe(list => {

      // Build form
      let sportFormArr: FormArray = new FormArray([]);

      for (let i=0; i < list.length; i++) {
        let fg = new FormGroup({});
        fg.addControl(list[i].id, new FormControl(false));
        sportFormArr.push(fg);
      }

      this.accountForm = this.formBuilder.group({
        firstname: ['', Validators.compose([Validators.maxLength(30), Validators.pattern('[a-zA-Z ]*'), Validators.required])],
        lastname: ['', Validators.compose([Validators.maxLength(30), Validators.pattern('[a-zA-Z ]*'), Validators.required])],
        company: [''],
        sports: sportFormArr
      });

      console.log('form ', this.accountForm);
    })

  }

但是我收到以下错误:

ERROR Error: Cannot find control with path: 'sports -> 0 -> '

以下是accountForm enter image description here

的内容

知道为什么吗?

1 个答案:

答案 0 :(得分:5)

我不知道如何/如果你可以获取动态创建的formcontrol的属性名称......但是你可以利用你所拥有的列表来构建表单组。然后,您只需将要获取的列表分配给局部变量,以便可以在模板中使用它。

首先,如果你想使用这项运动的object UserItemIds{ case class UserItemIds( user: User, itemIds: List[Long]) def apply(user:User,itemIds:List[Long]) = new UserItemIds(user,itemIds)} ,你需要更改表单组的创建并使用name而不是id:

name

然后如上所述,您可以在模板中使用列表和索引,所以:

fg.addControl(this.list[i].name, new FormControl(false));

这是 PLUNKER