我创建了 form: FormGroup 变量,我在服务的构造函数中使用 FormArray localizationData: FormArray 定义了组:
this.form = this.formBuilder.group({
localizationData: this.formBuilder.array([])
});
然后我将具有特定 FormControl 的 FormGroup 推送到该 FormArray,并具有此功能:
addLocalizedFormGroup(locale?: any){
locale = (locale == undefined) ? this.selectedLocale : locale;
let formArray = <FormArray>this.form.get('localizationData');
formArray.push(this.formBuilder.group({
locale: [locale.code],
codelistName: ['', Validators.required]
}));
locale.created = true;
this.createdLocales.push(locale);
}
在组件的 ngOnInit 中,我调用了该函数两次。语言环境对象变量示例:
{ "code": "SK", "name": "Slovenčina" }
要向用户显示我使用此功能的语言环境的特定格式:
localeFormatter = (x: any) => x.code + " | " + x.name;
我实现了带有本地化的简单选项列表,供用户选择一个:
<div class="form-group col-3">
<label>Lokalizácia
<select class="form-control" [(ngModel)]="this.defservice.selectedLocale">
<option *ngFor="let locale of this.defservice.createdLocales" [ngValue]="locale">{{this.defservice.localeFormatter(locale)}}</option>
</select>
</label>
</div>
该选项列表工作正常。当我选择不同的语言时,模型作为对象发生变化。为了按语言环境查找 FormGroup,我为此创建了非常简单的函数:
localizationIndexOf(locale: any): number{
return (<FormArray>this.form.get('localizationData')).controls.findIndex(x => x.get('locale').value == locale.code);
}
现在,我要挑战的问题是显示 FormControl 的用户值,codelistName,正如您在函数 addLocalizedFormGroup 中看到的那样。这是 html:
<ng-container [formGroup]="defservice.form">
<ng-container formArrayName="localizationData">
<ng-container [formGroupName]="defservice.localizationIndexOf(defservice.selectedLocale)">
<div class="row">
<div class="form-group col-2">
<label>Lokalizácia
<input type="text" class="form-control" [value]="defservice.localeFormatter(defservice.selectedLocale)"
disabled="true">
</label>
</div>
<div class="form-group col-10">
<label>Názov <span style="color: red">*</span>
<input type="text" class="form-control" formControlName="codelistName">
</label>
</div>
</div>
</ng-container>
</ng-container>
</ng-container>
但是在选项列表中切换语言后,本地化值正确更改,localizationIndexOf(defservice.selectedLocale) 返回正确的索引但是在编辑使用函数 addLocalizedFormGroup 创建的 FormmArray 的任何索引的 codelistName 之后,我添加的内容只有第一个(索引为 0 ) 在改变。我打印了整个形式的值(value),它只显示了第一语言的变化值(value)。事件如果我有 2 种或 10 种语言。我的意思是 2 或 10 个将 FormGroups 插入表单的 localizationData FormArray:FormGroup。似乎在第一次加载组件时,formGroup 永远不会更新他的值,我引用了这一行:
<ng-container [formGroupName]="defservice.localizationIndexOf(defservice.selectedLocale)">
感谢您的任何建议。
最佳答案
我自己重新创建了问题,但无法找到 *ControlName=''
的解决方案句法。我找到了一个 [formControl]=''
但你将不得不忘记 formGroupName
层次结构。
如果你能保留当前FormGroup
的索引的引用的 localizationData: FormArray
,您将能够从数组中获取控件:
<input class="..." type="text" [formControl]="localizationData.at(currentLocaleIndex).get('codelistName')">
localizationData
是 FormArray 的 setter/getter :
get localizationData(): FormArray {
return this.form.get('localizationData') as FormArray
}
还有一个解决方案来保持currentLocaleIndex
up to date 是在 <select>
发生变化时更新值像这样:
<select (change)="updateCurrentLocaleIndex()" class="form-control" [(ngModel)]="this.defservice.selectedLocale">
<option *ngFor="let locale of this.defservice.createdLocales" [ngValue]="locale">{{this.defservice.localeFormatter(locale)}}</option>
</select>
在你的组件类中:
updateCurrentLocaleIndex() {
this.currentLocaleIndex = this.localizationIndexOf(this.defservice.selectedLocale)
}
关于html - Angular 9 - 具有相同名称的 formControlName 的不同 formGroupName 影响相同的 formControlName,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63893251/