我将只使用.map
onthis.supportedLocales
然后使用该方法生成FormGroup
s 。getFormGroupForLocale
因为它private
不会在您的模板中使用。
现在一旦表单准备好,首先我将form
使用[formGroup]="form"
. 在那之后,由于我的表单有一个FormArray
,我首先必须div
为它创建一个包装。为此,div
我将分配formArrayName="translatable"
哪个将这个 div 映射到我translatable
FormArray
的form
FormGroup
.
在此内部,我将使用*ngFor="let group of localeFormArray; let i = index;"
循环遍历FormGroup
my 中的所有 sFormArray
并将它们绑定到div
使用<div [formGroupName]="i">
. 请注意我如何使用formGroupName
as 属性绑定语法并将其分配i
给FormGroup
我FormArray
最后在 this 的每个标签input
内div
,我可以使用formControlName="title"
andformControlName="body"
绑定到.FormControl
FormGroup
FormArray
就是这样:
<form [formGroup]="form">
template
is_home
translatable
<label for="template">Template</label>
<input type="text" id="template" formControlName="template">
<br><br>
<label for="is_home">Is Home</label>
<input type="text" formControlName="is_home" id="is_home">
<br><br>
<h1>translatable</h1>
<div formArrayName="translatable">
<div *ngFor="let group of localeFormArray; let i = index;">
<div [formGroupName]="i">
<label
[for]="'title'+supportedLocales[i].lang.locale">
{{ translateField('page::pages.title') }}
</label>
<input
formControlName="title"
[id]="'title'+supportedLocales[i].lang.locale"
class="form-control">
<br><br>
<label
[for]="'title'+supportedLocales[i].lang.locale">
{{ translateField('page::pages.title') }}
</label>
<input
formControlName="body"
[id]="'title'+supportedLocales[i].lang.locale"
class="form-control">
</div>
</div>
</div>
</form>
对于组件类:
import { Component } from '@angular/core';
import { FormGroup, FormControl, FormBuilder, Validators, FormArray } from '@angular/forms';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
form: FormGroup;
supportedLocales = [
{ lang: { locale: 'en-US' } },
{ lang: { locale: 'en-FR' } },
];
constructor(private fb: FormBuilder) {}
ngOnInit() {
this.form = this.fb.group({
template: ['default', [Validators.required]],
is_home: [0],
translatable: this.fb.array(this.supportedLocales.map(locale => this.getFormGroupForLocale(locale)))
});
}
private getFormGroupForLocale(language) {
return this.fb.group({
title: [language.lang.locale + 'Title', [Validators.required]],
body: [language.lang.locale+'Body', [Validators.required]]
});
}
...
get localeFormArray() {
return (<FormArray>this.form.get('translatable')).controls;
}
}
这是您参考的示例 StackBlitz。