Я создал библиотеку под названием ngrx-forms, что делает именно то, что вы хотите. Вы можете получить его на НОМ через:
npm install ngrx-forms --save
Я рекомендую проверить полную README на странице GitHub, но ниже вы можете найти некоторые примеры того, что вам нужно сделать, чтобы получить библиотеку и работают после установки.
Импорт модуля:
import { StoreModule } from '@ngrx/store';
import { NgrxFormsModule } from 'ngrx-forms';
import { reducers } from './reducer';
@NgModule({
declarations: [
AppComponent,
],
imports: [
NgrxFormsModule,
StoreModule.forRoot(reducers),
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
Добавить в состояние группы где-то в дереве состояний с помощью createFormGroupState
и вызвать formGroupReducer
внутри вашего редуктора:
import { Action } from '@ngrx/store';
import { FormGroupState, createFormGroupState, formGroupReducer } from 'ngrx-forms';
export interface MyFormValue {
someTextInput: string;
someCheckbox: boolean;
nested: {
someNumber: number;
};
}
const FORM_ID = 'some globally unique string';
const initialFormState = createFormGroupState<MyFormValue>(FORM_ID, {
someTextInput: '',
someCheckbox: false,
nested: {
someNumber: 0,
},
});
export interface AppState {
someOtherField: string;
myForm: FormGroupState<MyFormValue>;
}
const initialState: AppState = {
someOtherField: '',
myForm: initialFormState,
};
export function appReducer(state = initialState, action: Action): AppState {
const myForm = formGroupReducer(state.myForm, action);
if (myForm !== state.myForm) {
state = { ...state, myForm };
}
switch (action.type) {
case 'some action type':
// modify state
return state;
default: {
return state;
}
}
}
Expose состояние формы внутри компонента:
import { Component } from '@angular/core';
import { Store } from '@ngrx/store';
import { FormGroupState } from 'ngrx-forms';
import { Observable } from 'rxjs/Observable';
import { MyFormValue } from './reducer';
@Component({
selector: 'my-component',
templateUrl: './my-component.html',
})
export class MyComponent {
formState$: Observable<FormGroupState<MyFormValue>>;
constructor(private store: Store<AppState>) {
this.formState$ = store.select(s => s.myForm);
}
}
Установить contr ol в вашем шаблоне:
<form novalidate [ngrxFormState]="(formState$ | async)">
<input type="text"
[ngrxFormControlState]="(formState$ | async).controls.someTextInput">
<input type="checkbox"
[ngrxFormControlState]="(formState$ | async).controls.someCheckbox">
<input type="number"
[ngrxFormControlState]="(formState$ | async).controls.nested.controls.someNumber">
</form>
Я использую ngrx, но не проверяю форму как таковую. Я решил оставить ngModel, чтобы сделать свой бизнес (мутируя прочь ...) беспрепятственно. Я использую кнопку отправки, чтобы отправить данные в хранилище и вызвать изменения для остальной части приложения. –
. Вы можете использовать хранилище в сочетании с формами, управляемыми моделью. Посмотрите эту замечательную статью об этом: http://blog.thoughtram.io/angular/2016/06/22/model-driven-forms-in-angular-2.html –
Я также ищу хороший пример, есть тонны учебников и блогов по формам и ngrx, но не вместе. – Seb