Как получить сущность по идентификатору ngrx - PullRequest
0 голосов
/ 28 мая 2019

У меня есть следующий магазин

export const featureAdapter: EntityAdapter<IProduct> = createEntityAdapter<IProduct>({
  selectId: model => model.id,
});

export interface State extends EntityState<IProduct> {
  selectedProduct?: IProduct;
  isLoading?: boolean;
  error?: any;
}

export const initialState: State = featureAdapter.getInitialState({
  selectedProduct: IProduct,
  isLoading: false,
  error: null
});

Мне бы хотелось, чтобы мой выбранный продукт всегда указывал на сущность и получал с ней обновления. Я считаю, что поскольку действия всегда создают новый объект, ссылка невозможна, я решил изменить выбранный продукт со ссылки на простой идентификатор.

export const initialState: State = featureAdapter.getInitialState({
  selectedProduct: string,
  isLoading: false,
  error: null
});

но как мне получить мою сущность с тем же идентификатором и получить обновления на моей наблюдаемой, если она изменилась?

Я пытался

export const getSelectedProduct: MemoizedSelector<object, any> = createSelector(
  selectAllEntities,
  selectedProduct,
  (entities, id) => entities[id]
);


export const selectEntityById = createSelector(
  selectAllEntities,
  (entities, props) => entities[props.id]
);

мои вопросы Это единственный способ выбрать объект по идентификатору?

this.store$.pipe(
  select(ProductStoreSelectors.selectEntityById, { id: product.id }),
  map(product => console.log(product))
)

и this.store $ .select (ProductStoreSelectors.getSelectedProduct) .subscribe ((product: string) => { console.log (продукт) }),

это никогда не срабатывает, когда я меняю выбранный товар. Идентификатор

РЕДАКТИРОВАТЬ:

редуктор на выбор сделать следующее

const SET_SELECTED_PRODUCT = (state: State, action: featureAction.SetSelectedProduct) => {
  return {
    ...state,
    selectedProduct: action.payload.product.id
  };
};

1 Ответ

0 голосов
/ 28 мая 2019

Попробуйте что-то вроде этого в вашем селекторе:

export const selectEntityById = (id: number) => createSelector(
  selectAllEntities,
  (entities) => entities[id]
);

и ваш выбор:

select(ProductStoreSelectors.selectEntityById(id))
...