2016-12-01 19 views
7

Angular2'nin FormGroup.patchValue() yeni öğeleri bir diziye zorlamıyor gibi görünüyor mu? BöyleAngular2 patchValue push değeri diziye

Örneğin şey:

ngOnInit() { 

    this.form = this.formBuilder.group({ 
     animal: [''], 
     school: this.formBuilder.group({ 
      name: [''], 
     }), 
     students: this.formBuilder.array([this.formBuilder.control('Bob')]) 
    }); 

    setTimeout(() => this.form.patchValue({ 
     animal: 'cat' 
     school : {name: 'Fraser'}, 
     students: ['Bob gets edited', 'This will not show'] 
    }), 250); 

} 

Will sadece güncelleme "öğrenci" ilk unsur ama İkinci unsur sokmayın olacaktır.

Her iki öğeyi de görüntülemek için ne yapmam gerekir?

Plunker here.

cevap

4

.patchValue() yalnızca mevcut FormArray güncelleştirmesini yapar, form modelinizin yapısını değiştirmez.

patchValue (değer: Herhangi [], {onlySelf, emitEvent} ?: {onlySelf ?: boolean emitEvent ?: boole}): void Yamalar FormArray değeri. , denetimin yapısına uyan bir dizi kabul eder ve , değerleri gruptaki doğru denetimlere uydurmak için elinden gelenin en iyisini yapar.

hatasını atmadan dizinin hem süper kümelerini hem de alt kümelerini kabul eder. görünmesi için

Aslında sırayla dizinin üzerine itme yeni eleman gerekir.

this.form.controls['students'].push(new FormControl('This will not show')); 

Bu FormArray belgelerinde https://angular.io/docs/ts/latest/api/forms/index/FormArray-class.html

+1

nasıl önceden zorlamaya kaç form denetimleri bilmek mümkün mü? – kostia

+0

İyi soru Kostia. Bunu anlayabilir misin? – MeMeMax

8

Eh tüm silentsod söylediği gibi, mümkün değildir vardır. Şu anda, alternatif olarak aşağıda kullanıyorum:

 let controlArray = <FormArray>this.form.controls['apps'];   
     this.list.forEach(app => { 
        const fb = this.buildGroup(); 
        fb.patchValue(app); 
        controlArray.push(fb); 
      }); 

Eğik Ekibi - Bir toplama/nesne grafikten yama olur PatchArray gibi yeni bir fonksiyon şey() gerekir. Temel kullanım durumudur.

-1

Eh, öğrendim çözümdür:

this.myForm.controls['array'] = this.formBuilder.array(newArray.map(i => this.formBuilder.group(i)));