2017-06-01 10 views
0

FormArrayを使用して動的複製を達成しようとしていましたが、できませんでした。フォームはJSFiddleでご確認ください。formArrayを使用してコントロールを動的に複製できません

<div class="form-group"> 
    <div formArrayName="nqCoordinators"> 
    <button class="col-md-offset-1 col-md-1 btn btn-default" type="button"> 
     Add Coordinator 
    </button> 
    <div class="form-group" [ngClass]="{'has-error': (agencyForm.get('nqCoordinators').touched || agencyForm.get('nqCoordinators').dirty) && !agencyForm.get('nqCoordinators').valid}" 
     *ngFor="let nqCoordinator of nqCoordinators.controls; let i=index"> 
     <label class="col-md-2 control-label" [attr.for]="i">Coordinator</label> 
     <div class="col-md-8"> 
     <input class="form-control" id="i" type="text" placeholder="NQ Coordinator" formControlName="i" /> 
     </div>    
    </div> 
    </div> 
</div> 

component.ts

import { 
    Component, 
    OnInit 
} 
from '@angular/core'; 
import { 
    FormGroup, 
    FormControl, 
    FormBuilder, 
    Validators, 
    FormArray 
} 
from '@angular/forms'; 
import { 
    ActivatedRoute, 
    Router 
} 
from '@angular/router'; 
import { 
    Subscription 
} 
from 'rxjs/Subscription'; 


@Component({ 
    templateUrl: './newq.component.html' 
}) 
export class CreateNewQComponent implements OnInit { 
    pageTitle: string; 

    agencyForm: FormGroup; 


    private sub: Subscription; 
    get nqCoordinators(): FormArray { 
    return <FormArray>this.agencyForm.get('nqCoordinators'); 
    } 

    constructor(private route: ActivatedRoute, private fb: FormBuilder, private router: Router) {} 

    //myOptions: IMultiSelectOption[] = [ 
    // { id: 1, name: 'Option 1' }, 
    // { id: 2, name: 'Option 2' }, 
    //]; 

    ngOnInit(): void { 
     this.agencyForm = this.fb.group({ 
     nqCoordinators: this.fb.array([]), 
     //qAdvisors: '', 
     nq1: '', 
     nq2: '', 
     nq3: '', 
     nq4: '', 
     nqCoordinators: this.fb.array([]), 
     nqStartDate: ''   
     }); 

     this.agencyForm.controls['salesRep'].valueChanges 
      .subscribe((selectedOptions) => { 
       // changes 
      }); 
     this.sub = this.route.params.subscribe(
     params => { 
      let id = +params['id']; 
      if (id === 0) 
      this.pageTitle = 'Add Q'; 
      else 
      this.pageTitle = 'Edit Q'; 
     } 
    ); 

    } 

    add() { 
    console.log(this.newQForm); 
    console.log('Saved: ' + JSON.stringify(this.newQForm)); 
    } 

    addAgency() { 
    console.log(this.newQForm); 
    console.log('Saved: ' + JSON.stringify(this.newQForm)); 
    } 

    backBtnClick() { 
    this.router.navigate(['/newq']); 
    } 
} 
+0

*重複するコントロール*とはどういう意味ですか?正確に何が問題なのですか、それは不明ですか?現在の行動とは何か、期待される行動は何か? – Alex

+0

私はコーディネーターのテキストボックスフィールドを動的に複製しようとしていました(あなたがJSFiddleで見ることができれば)、それはうまく動作しません。 – user1704842

+0

配列にコーディネーターを追加することを意味すると思いますか?私はそれがそうだったと確信しています:)私はあなたのコードを見てみましょう、私たちがこれを理解できるかどうかを見てみましょう。 – Alex

答えて

1

component.htmlあなたはそこに多くのコードを持っているので、ここでは単純な例です。

まず、<form>タグがネストされています。それだけでは機能しません。代わりにテンプレート内にメインの[formGroup](フォームタグ付き)を1つだけ持つ必要があります。残りのテンプレートはformControlNameです。 FormArrayNameとネストされたFormGroupNameのです。

this.agencyForm = this.fb.group({ 
    agencyName: [''], 
    nqCoordinators: this.fb.array([ 
    this.initNqCoordinators() // we'll use the same function for adding new 
    ]) 
}); 

initNqCoordinators() { 
    return this.fb.group({ 
    // here add all your form controls needed for your coordinator 
    whatever_form_control: [''] 
    }) 
} 

、ここであなたは新しいコーディネーターを追加するためにクリックするテンプレートとき、それは次のようになります:だからここ

は、我々は1つのコーディネータが最初に設定されているフォームのビルドになり

addCoordinator() { 
    // our formarray with coordinators 
    const control = <FormArray>this.agencyForm.controls['nqCoordinators']; 
    // we call function to push a new formgroup to the array 
    control.push(this.initNqCoordinators()) 
} 

次に、あなたのテンプレートは次のようになります。

<form [formGroup]="agencyForm" (ngSubmit)="submit(agencyForm.value)"> 
    <label>Agency Name: </label> 
    <input formControlName="agencyName"/><br><br> 
    <button (click)="addCoordinator()">Add Coordinator</button><br> 

    <div formArrayName="nqCoordinators"> 
    <div *ngFor="let child of agencyForm.controls.nqCoordinators.controls; let i = index" > 
     <div formGroupName="{{i}}"> 
      <label>Whatever Coordinator formControl-name</label> 
      <input formControlName="whatever_form_control" /><br><br> 
     </div> 
    </div> 
    </div> 
    <button type="submit">Submit</button> 
</form> 

DEMO上記と同じです。

+0

返事をいただきありがとうございます!あなたはそれをはるかに容易に見せました。私はあなたの助けに感謝します!! – user1704842

+0

問題ありません!私はそれが最初に混乱する可能性があることを知っています。私は反応するフォームの仕組みの周りに頭を包む前に、しばらく頭を傷つけました。それを聞いてうれしかったです。 – Alex

関連する問題