Skip to content

Instantly share code, notes, and snippets.

@DaveMBush
Last active July 14, 2017 15:22
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save DaveMBush/b79c333224340b6a9d96ed719b116112 to your computer and use it in GitHub Desktop.
Save DaveMBush/b79c333224340b6a9d96ed719b116112 to your computer and use it in GitHub Desktop.
NgRX-With-SubReducers
app/
+-store/
+-route1/
+-sub-reducer1/
--sub-reducer1.actions.ts
--sub-reducer1.effects.ts
--sub-reducer1.model.ts
--sub-reducer1.reducer.ts
+-sub-reducer2/
--route1.actions.ts
--route1.effects.ts
--route1.model.ts
--route1.reducer.ts
+-route2/
@Effect() _save$ = this.update$
.ofType(StagedEditActions.SAVE)
.switchMap(() => {
return this.store.select(x => x.route1).first();
})
.map(route1Data => this.service.save(route1Data))
.map(requestId$ => {
requestId$.subscribe(id => {
this.store.dispatch(route1Actions.load(id));
});
return {type: 'noop'};
});
interface Route1Model {
subItem1?: SubModel1;
subItem2?: SubModel2;
}
export function route1Reducer(state: Route1Model =
{
subReducer1: {/* subReducer definition here */},
subReducer2: {/* subReducer definition here */}
}, action: Action) {
// process action here
};
export const Route1Reducer: ActionReducer<Route1Model> = route1Reducer;
const reducerList = {
subReducer1: subReducer1,
subReducer2: subReducer2
};
let returnState = state;
Object.keys(reducerList).map(item => {
const newState = reducerList[item](state[item], action);
if(newState !== state[item]) {
const newItem = {};
newItem[item] = newState;
returnState = Object.assign({}, returnState, newItem);
}
});
return returnState;
save(event) {
event.stopPropagation();
this.store.dispatch(Route1Actions.save());
return false;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment