Angular NGRX: multiple Entities in one EntityAdapter possible?

后端 未结 1 1299
死守一世寂寞
死守一世寂寞 2021-02-13 03:35

Recently NGRX/Entities have been introduced:

https://medium.com/ngrx/introducing-ngrx-entity-598176456e15 https://github.com/ngrx/platform/tree/master/example-app

相关标签:
1条回答
  • 2021-02-13 04:15

    NgRx entity is a simple and small library to handle large arrays even thought the documentation does not explain how to use more than one entity in one state, it should be easy since the library what it does behind the scenes is just normalize the array and create a dictionary with the data.

    In order to make work the state with one or more entities follow the next steps:

    Start by defining a state of each entity.

    interface CarState extends EntityState<Car> {
      total: number;
    }
    
    interface PlaceState extends EntityState<Place> {
      total: number;
    }
    

    Then create a state that holds the entities

    export interface State {
      msg: string;
      cars: CarState;
      places: PlaceState;
    }
    

    Create the adapters for each entity state to manipulate the data and create the initial states.

    const adapterCar = createEntityAdapter<Car>();
    const adapterPlace = createEntityAdapter<Place>();
    
    const carInitialState: CarState = adapterCar.getInitialState({ total: 0 });
    const placeInitialState: PlaceState = adapterPlace.getInitialState({ total: 0 });
    

    Define the initial global state

    const initialState = {
      msg: 'Multiple entities in the same state',
      cars: carInitialState,
      places: placeInitialState
    }
    

    Create the reducer:

    export function reducer(state: State = initialState, action: ExampleActions): State {
    
      switch (action.type) {
    
        case ExampleActionTypes.GetCarList:
          return { ...state, cars: adapterCar.addMany(action.payload, state.cars) };
    
        case ExampleActionTypes.GetPlaceList:
          return { ...state, places: adapterPlace.addMany(action.payload, state.places) };
    
        default:
          return state;
      }
    
    }
    

    Expose the selectors

    export const selectCarState = (state: State) => state.cars;
    export const selectPlaceState = (state: State) => state.places;
    
    export const { selectAll: selectAllCars } = adapterCar.getSelectors();
    export const { selectAll: selectAllPlaces } = adapterPlace.getSelectors();
    

    That's it :)

    Live example: https://stackblitz.com/edit/angular-multiple-entities-in-same-state

    0 讨论(0)
提交回复
热议问题