0

我在 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[]) {}
}
4

0 回答 0