我在 Firestore 中维护了一个事件数据库。我使用 AngularFire5 将事件同步到我的应用程序。
这些事件有许多“会话”,可以更新我的多个管理员和用户(评级、问题等)。
我正在使用ngrx store、reducers 和effects 来保持同步。我能够弄清楚单个会话更新/删除/添加。
问题是会话的初始加载返回一个会话[]。除此之外,快照更改可能会返回“添加”、“修改”和“删除”会话。如何在会话不存在时使用单个操作+reducer 函数添加,但在会话存在时更新或删除。(我没有在我的 firebase 服务中调用 store.dispatch,我正在使用效果来管理它)
session.effect.ts
@Effect()
getSession: Observable<Action> = this.actions.ofType(SessionActions.ADD_SESSION)
.map((action: SessionActions.AddSession) => action.payload)
.switchMap(payload => this.db.getSessions(payload)
.map((sessions:Session[]) => new SessionActions.AddSessionSuccess(sessions))
);
session.reducer.ts
export function SessionReducer(state: Session[], action: Action) {
// console.log('SessionsReducer :: Action Type: ' + action.type + ', Action Payload: ' + JSON.stringify(action.payload));
switch(action.type) {
case SessionActions.ADD_SESSION_SUCCESS:
return [ ...state, action.payload ];
case SessionActions.CREATE_SESSION_SUCCESS:
return [ ...state, action.payload ];
case SessionActions.UPDATE_SESSION_SUCCESS:
return state.map(session => {
return session.id === action.payload.id ? Object.assign({}, action.payload) : session;
})
case SessionActions.ADD_SESSION:
case SessionActions.DELETE_SESSION_FAILURE:
return state;
default:
return state;
}
}
session.actions.ts
//Used to search the sessions by event id, think of it as GetSessions
export class AddSession implements Action {
readonly type = ADD_SESSION;
constructor(public payload: string) {}
}
export class AddSessionSuccess implements Action {
readonly type = ADD_SESSION_SUCCESS;
constructor(public payload: Session[]) {}
}