Автор ngrx-форм здесь.
Возьмите следующий компонент, который создает форму, как вы описали выше, с @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 код будет выглядеть так: (используя 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 || '',
},
)
);
}
}
Вместо использования встроенных AddArrayControlAction
из ngrx-форм вы также можете создать свое собственное действие и затем добавить элемент управления в редуктор, например:
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));
}
}
Надеюсь, это поможет.