ngrx-forms 的作者在这里。
使用下面的组件来构建你上面描述的表单,@angular/forms。
export class ExampleComponent {
private formBuilder = new FormBuilder();
private form = this.formBuilder.group({});
buildForm() {
this.form = this.formBuilder.group({
topic: '',
languages: this.formBuilder.array([]),
});
this.addLanguageControlGroup();
}
addLanguageControlGroup(lang?: string, code?: string) {
const newControl = this.formBuilder.group({
language: lang || '',
code: code || '',
});
(this.form.get('languages') as FormArray).push(newControl);
}
}
使用 ngrx-forms,代码将是这样的 reducer(使用 ngrx v8+):
interface MyFormValue {
topic: string;
languages: LanguageFormValue[];
}
interface LanguageFormValue {
language: string;
code: string;
}
const INITIAL_FORM_VALUE: MyFormValue = {
topic: '',
languages: [
{
language: '',
code: '',
},
],
};
const myFormReducer = createReducer(
{
formState: createFormGroupState('MY_FORM', INITIAL_FORM_VALUE),
},
onNgrxForms(),
);
在你的组件中,你可以有这样的东西:
export class NgrxFormsExampleComponent {
@Input() formState: FormGroupState<MyFormValue>;
constructor(private actionsSubject: ActionsSubject) { }
addLanguageControlGroup(lang?: string, code?: string) {
this.actionsSubject.next(
new AddArrayControlAction<LanguageFormValue>(
this.formState.controls.languages.id,
{
language: lang || '',
code: code || '',
},
)
);
}
}
除了使用 ngrx-forms 中的内置 AddArrayControlAction 之外,您还可以创建自己的操作,然后在 reducer 中添加控件,如下所示:
const addLanguageControlGroup = createAction(
'MY_FORM/addLanguageControlGroup',
(lang?: string, code?: string) => ({ lang, code }),
);
const myFormReducer = createReducer(
{
formState: createFormGroupState('MY_FORM', INITIAL_FORM_VALUE),
},
onNgrxForms(),
on(addLanguageControlGroup, ({ formState }, { lang, code }) => ({
formState: updateGroup(formState, {
languages: addArrayControl({
language: lang || '',
code: code || '',
}),
}),
})),
);
export class NgrxFormsExampleComponent {
@Input() formState: FormGroupState<MyFormValue>;
constructor(private actionsSubject: ActionsSubject) { }
addLanguageControlGroup(lang?: string, code?: string) {
this.actionsSubject.next(addLanguageControlGroup(lang, code));
}
}
我希望这会有所帮助。