Değişken uzunluklarda nesne dizileriyle ilgilenmek için FormArrays kullanıyorum. Benim mevcut uygulama çoğunlukla çalışır iken, benim validade yapılan herhangi bir değişiklik kendi "ana" FormGroup ... veya en azından otomatik olarak değil, FormGroup olabilir olabilir FormGroup tarafından yönetilen başka bir kontrolün değerini değiştirerek güncellendi.Angular2 reaktif formlar: FormArray ile üst FormHroup eşitleme
Bu noktada, uygulamamın yanlış bir şey olup olmadığını anlayamıyorum, ya da bir şey beklemem gerekiyorsa yapmam gerekmiyor ... Sonunda "sorun" ne olursa olsun, memnuniyetle yaparım bu noktada herhangi bir giriş yapın. Plunker için
Bağlantı: https://plnkr.co/edit/PLslyJo1YOszGwTpujyx
Plunker içinde app.ts üstündeki açıklama sorunu yeniden oluşturmaya adımları ayrıntılı (Açısal sürümü 2.0.1 ise) (veya bir problem nedir bana, yine de). Plunker bağlarken
olarak SO bazı kodunu sorar, burada bu Plunker belirtilmiştir
this.form = this.fb.group({
"size":[0, Validators.required],
"someArray": this.fb.array(this.initFormArray(0), Validators.required),
"someOtherField":[null]
});
initFormArray(size:number):FormGroup[]{
let newFormArray:FormGroup[] = [] ;
for(let i = 0 ; i < size ; i++){
newFormArray.push(this.fb.group({
fieldA: [null, Validators.required],
fieldB: [null, Validators.required]
}));
}
return newFormArray;
}
updateFormArray(value:string){
let newSize:number = parseInt(value) ;
if(newSize >= 0){
this.form.controls["someArray"] = this.fb.array(this.initFormArray(newSize))
this.form.updateValueAndValidity();
}
}
FormGroup ve FormArray tanımına ilişkin hatları vardır, ama burada da bahsetmek diye FormArray ait valueChanges abone yardımcı görünmüyor (veya belki benim abonelik içine doğru olanı yapmadı): :)
yılında şıngırdayan herkesethis.form.controls['someArray'].valueChanges.subscribe((data) => this.form.updateValueAndValidity());
Teşekkür
DÜZENLEME (2016-10-11): valueChanges
kanca ile oynamak, biraz daha sorunu çözmeme izin verdi, ancak tatmin edici olmayan bir çözümle. Bu nedenle, kendi sorumu cevaplamak yerine düzenlemeyi yapıyorum, ancak herhangi bir mod bunun geçerli bir sonuç olduğunu düşünürse, her durumda lütfen uygun bulduğunuz şeyi yapın. Benim "çözüm" gelince
: yerine FormArray veya kök FormGroup düzeyinde valueChanges
abone arasında, neredeyse ben FormArray oluşturmak her FormGroup gözlemlenebilir valueChanges
abone olarak ne istediğini elde edebiliriz:
initFormArray(size:number):FormGroup[]{
let newFormArray:FormGroup[] = [] ;
for(let i = 0 ; i < size ; i++){
let formGroup = this.fb.group({
fieldA: [null, Validators.required],
fieldB: [null, Validators.required]
}) ;
formGroup.valueChanges.subscribe((data) => this.form.updateValueAndValidity());
newFormArray.push(formGroup);
}
return newFormArray;
Bunu yaparak, FormArray değiştirildiğinde, ancak bir gecikme ile kök FormGroup güncellenir. Örneğin, A alanında "123" yazarsam, kök FormGroup değeri "fieldA":"12"
içerir.
Bu nedenle, benim "tatmin edici" çözümüm: abonelikte bir küme setTimeout ekleyerek, root FormGroup tam olarak istediğim şekilde güncelleştirir ... ideal olarak bir setTimeout'a gerek yoktur.
formGroup.valueChanges.subscribe((data) => setTimeout(()=>this.form.updateValueAndValidity(), 1);
SetTimeout'a başvurmadan bunu yönetmenin herhangi bir yolu var mı?
updated Plunker: https://plnkr.co/edit/7mbTNPHjRhlU3ostf3av
Girdiğiniz için çok teşekkürler! Ben ne aradığım yakın olduğu göz önüne alındığında, ben setControl, setValue ve patchValue ... utanç verici ile uğraşmak bile denemedim;) İlk başta verdiğiniz plunker işe yaramadı, ancak eklenen bağlantı ile Belgelerim, tam olarak ne istediğimi (setControl ile) elde edebildim: https://plnkr.co/edit/mvkVXN2bsJXkP1O3Zbcl?p=preview – phl
Çözümünüzle ilgili tek sorun @phl; bazı değerler ekleyin, formArray geçerli değerleri kaybederek değiştirilir. –
Birisi mevcut değerlerini korumak istediğinde, kalıcı bir çözüm ekledim https://plnkr.co/edit/vQ8WAR6cayGr4mC2dqUa?p=preview –