0

在 4.0.x 版本的 ngrx git 存储库中的示例应用程序的帮助下,我使用 ngrx/store 4.0.2 创建了一个应用程序。我用来运行这部分应用程序的其他模块。@angular/cli:1.3.0 节点:v8.1.3 npm:5.3.0。我有其他模块遵循相同的模式,每个人都表现出同样的问题。请帮我纠正这个问题。

我调用 api 的效果函数是 .

 @Effect() loadUsers$: Observable<Action> = this.actions$
        .ofType(ObjectActions.LOAD_USERS)
        .startWith(new ObjectActions.Loadusers())
        .switchMap(() => 
              this.service.loadUsers()
              .map((users: UserModel[]) => new ObjectActions.Loaduserssuccess(users))
              .catch(err => of(new ObjectActions.Loadusersfailure(err)))

        )

我的减速器是 users.reducer.ts

export interface UserState {
    user_ids: string[]
    users: {[id: string]: Array<UserModel>}
    selectedUserId: string| null;
}

const initialState: UserState = {
    user_ids: [],
    users: {},
    selectedUserId: null
}

export function UsersReducer(state = initialState, action: UserActions.Actions): UserState {
    switch(action.type){
        case UserActions.LOAD_USERS_SUCCESS:
            return {
                          user_ids: action.payload.user_ids,
                          users: action.payload.users,
                          selectedUserId: null
                      }

        case UserActions.LOAD_USERS_FAILURE:

        case UserActions.ADD_USER_SUCCESS:
            return {
                            user_ids: [ ...state.user_ids, action.payload.user_id],
                            users: Object.assign({}, state.users, { [action.payload.user_id]: action.payload}),
                            selectedUserId: state.selectedUserId
                        };
        case UserActions.ADD_USER_FAILURE:

        case UserActions.GET_USER_SUCCESS:

        case UserActions.SELECT_USER_SUCCESS:
                      return {
                        user_ids: state.user_ids,
                        users: state.users,
                        selectedUserId: action.payload,
                          }
        case UserActions.DELETE_USER_SUCCESS:          
    enter code here
        default:
            return state
    }
}


export const getUsersId= (state: UserState) => state.user_ids

export const getUsers = (state: UserState) => state.users


export const getAllUsers = createSelector(getUsers, getUsersId, (users, user_ids) => {
    return user_ids.map(user_id => users[user_id]) || new Map();
});



export const selectedUserId = (state: UserState) => state.selectedUserId;


export const getSelectedUser = createSelector(getUsers, selectedUserId, (entities, selectedId) => {
  return entities[selectedId];
});

export interface AppState {
  users: fromUser.UserState;
  loggedinuser: fromLogin.LoginState;
}
export const reducer: ActionReducerMap<AppState>  = {
    users: fromUser.UsersReducer,
  loggedinuser: fromLogin.LoginReducer,
};

export const getUserAppState =  createFeatureSelector<AppState>('users'); 
export const getUserState = createSelector(
  getUserAppState,
  (state: AppState) => state.users
);

export const getUsers = createSelector(getUserState, fromUser.getAllUsers)

从商店中选择 getUsers 时,我收到此错误

UsersComponent.html:50 ERROR TypeError: Cannot read property 'map' of undefined
    at users.reducer.ts:74
    at index.js:76
    at index.js:36
    at index.js:90
    at index.js:36
    at store.es5.js:698
    at memoized (store.es5.js:666)
    at store.es5.js:702
    at MapSubscriber.memoized [as project] (store.es5.js:666)
    at MapSubscriber.webpackJsonp.../../../../rxjs/operator/map.js.MapSubscriber._next (map.js:77)
4

1 回答 1

1

这是因为选择器试图循环一些未定义的东西。它主要发生在这种情况下,即在 API 调用之前 store 是空的,但您的选择器正在尝试遍历它。因为我们只在 API 响应时才保存数据。

于 2018-05-18T05:48:38.637 回答