2017-06-01 9 views
1

Ionic 2では、トグルボタンのリストを表示する動的フォームを作成しようとしています。* ngForのFormGroupsを含むFormArrayを繰り返す

はので、私はFormArrayを使用しようとしていますやると角ドキュメントに、主にこれに基づき、この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

ですこの行に何か変わっていますか? 'formControlName =" {{sport.name}} "'私はこのエラーがこれと同じであると確信しています。 – developer033

+0

エラーが残り、iがインデックスと等しいため、 "スポーツ - > 0 - > 0"になります。私は動的で、sport.nameにあるはずの名前のコントロールを表示する必要があります。 –

+0

スポーツ内のフォームグループのように、実際にどのようにしたいのですか?私はどのようにオブジェクトのように見えるのだろうか? – Alex

答えて

1

動的に作成されたformcontrolのプロパティ名を取得する方法を教えてください。ただし、フォームグループを作成する代わりに、リストを利用できます。次に、取得しているリストをローカル変数に代入するだけで、テンプレート内で使用できるようになります。

まず第一に、あなたがスポーツのnameを使用したい場合は、あなたがあなたの創造formgroupを変更して、IDの代わりにnameを使用する必要があります言ったよう

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

はその後、あなたがリストを利用することができますし、そのテンプレートのインデックス、:

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

は、ここでは、EXP何ですかPLUNKER

+0

ありがとう@ AJT_82、それは完璧に動作します。唯一のことは、注文が同じであることを確認する必要があることです。違う理由はありませんが、それでも私はこれを確かめる必要がありますよね? –

+1

絶対に。しかし、私はStackポストのコードを単純化しました。実際には、いくつかのトグルをtrueに設定しました。気をつけるよ。再度、感謝します! –

関連する問題