同一州具有不同过滤器的多个列表 - NGRX 11 ANGULAR 11

Multiple list with different filter for the same State - NGRX 11 ANGULAR 11

我正在研究 angular 11 和 NGRX 11 项目。我希望有 2 个输入 select,它们是不同用户类型的用户。

例如:

我有两种类型的用户(卖家和买家):

我使用 NGRX 并且我有一个商店用户,但是当我打电话给商店时,我 return 相同的用户列表。

如何分离用户卖家列表和用户买家列表? (2 家商店?2 select 或 2 家商店?)

user.action.ts

export const loadUsers = createAction(
  '[Users List] Load Users via Service',
  props<{ filters: UserFilter }>()
);

export const usersLoadedDone = createAction(
  '[Users Effect] Users Loaded Successfully',
  props<{ users: Page<User> }>()


export const loadUser = createAction(
  '[Users List] Load User via Service',
  props<{ userId: string }>()
);

export const createUser = createAction(
  '[Create User Component] Create User',
  props<{ event: any, user: User }>()
);

export const deleteUser = createAction(
  '[Users List Operations] Delete User',
  props<{ userId: string }>()
);


export const updateUser = createAction(
  '[Users List Operations] Update User',
  props<{ user: User }>()
);


export const userActionTypes = {
  loadUsers,
  usersLoadedDone,
  loadUser,
  createUser,
  deleteUser,
  updateUser,
};

user.reducers.ts


export interface UserState extends EntityState<User> {
  isLoading: boolean;
  totalElements: number;
  totalPages: number;
  empty: boolean;
  page: number;
  filters: UserFilter;
}

export const adapter: EntityAdapter<User> = createEntityAdapter<User>({
  selectId: user => user.userId
});

export const initialState = adapter.getInitialState({
  isLoading: false,
  totalElements: null,
  totalPages: null,
  page: 0,
  empty: true
});

export const userReducer = createReducer(
  initialState,

  on(userActionTypes.loadUsers, (state, res) => ({
    ...state,
    isLoadingList: true,
    filters: res.filters
  })),

  on(userActionTypes.usersLoadedDone, (state, action) => {
    return adapter.setAll(
      action.users['content'],
      {
        ...state,
        isLoadingList: false,
        isLoad: true,
        totalElements: action.users.totalElements,
        totalPages: action.users.totalPages,
        empty: action.users.empty,
        page: action.users.number,
      }
    );
  }),

  ...
);

export const {selectAll, selectIds} = adapter.getSelectors();

user.selectors.ts

export const userFeatureSelector = createFeatureSelector<UserState>('users');

export const getAllUsers = createSelector(
  userFeatureSelector,
  selectAll
);

...

ps :如您所见,用户列表已分页,因此我的 angular 应用程序只有部分数据

您可以通过在功能状态中设置两个不同的状态来分离每个用户:

 export interface IUsersFeatureState{
  userSeller: IUserSellerState;
  userBuyer: IUserBuyerState;
 }

然后你可以有 2 个不同的减速器:

 export const reducers: ActionReducerMap<IUsersFeatureState> = {
  userSeller: UserSellerReducer,
  userBuyer: UserBuyerReducer
 }

每个减速器,你可以有不同的动作来加载 userSeller 和 userBuyer:

 export interface IUserSellerState {
  loaded: boolean,
  loading: boolean,
  userSeller: UserSellerModel
 }

 export interface IUserBuyerState{
  loaded: boolean,
  loading: boolean,
  userBuyer: UserBuyerModel
 }

 export const initialState: IUserSellerState ={ 
  loaded: false,
  loading: false,
  userSeller: null
 }   

  on(userSellerActionTypes.loadSellerUsers, (state, res) => ({
   ...state,
   loaded: false,
   loading: true
   userSeller: res
   })),

   on(userBuyerActionTypes.loadBuyerUsers, (state, res) => ({
   ...state,
   loaded: false,
   loading: true
   userBuyer: res
   })),

您也可以通过效果 class 控制从 API 的提取。 对于store模块,你可以像下面这样注册reducer:

 StoreModule.forFeature('UsersFeature', reducers),

对于选择器,您可以有 2 个选择器,每个选择器从两个不同的状态切片数据。

  export const getUserFeatureState = 
   createFeatureSelector<IUsersFeatureState>('userFeature');
  
  export getUserSellerDetails = (state: IUserSellerState ) => 
  state.userSeller