Как выбрать один элемент / сущность, ngrx?

У меня есть селектор для получения всех сообщений, фактически всех сущностей, теперь я хочу получить одну запись / сущность. Должен ли я отфильтровать сообщения, которые я получаю от селектора 'getAllPosts', или создать еще один и как это сделать?

Вот мои селекторы:

export const getPostsState = createFeatureSelector<fromPosts.PostState>('posts');

export const selectAllPosts = createSelector(getPostsState, fromPosts.getAllPosts);
export const selectPostsEntities = createSelector(getPostsState, fromPosts.getAllPosts);
export const selectPostsIds = createSelector(getPostsState, fromPosts.getPostsIds);
export const selectTotal = createSelector(getPostsState, fromPosts.getPostsTotal);
export const selectPostId = createSelector(getPostsState, fromPosts.getSelectedPostId);

export const getSelectedPost = createSelector(selectPostsEntities, selectPostId, (entities, id) => entities[id]);

Как видите у меня getSelectedPostId а также getSelectedPost селекторы, но я не уверен, как его использовать, я пытался следовать некоторым учебникам, но ничего не помогает..

0 ответов

Может быть, уже немного поздно, но это может кому-то помочь. Вы используете один и тот же селектор адаптера сущностей как для списка записей, так и для сущностей. И вы не определяете, что вы хотите делать с выбранными вами данными. Последний аргументcreateSelector Функция всегда должна быть функцией, имеющей аргументы, которые напрямую связаны с вышеупомянутыми селекторами, и должна возвращать некоторое значение (обычно сам аргумент или его модификацию).

export const selectAllPosts = createSelector(getPostsState, fromPosts.getAllPosts);
export const selectPostsEntities = createSelector(getPostsState, fromPosts.getAllPosts); // <-- see

Но следует использовать selectEntities вместо того selectAll. Представьте, что вы получаете такие селекторы от адаптера сущности, и у вас реализован собственный селектор идентификаторов:

// NgRX entity selectors
const {
  selectIds,
  selectEntities,
  selectAll,
  selectTotal,
} = adapter.getSelectors();

// Custom selector for the selected ID (I guess you have it in the store) and 
// should be the equivalent of your `getSelectedPostId` selector.
const getSelectedId = createSelector(getState, state => state.id);

Затем вы можете объединить selectEntities с getSelectedId следующим образом:

export const selectedEntity = createSelector(
  selectEntities,
  getSelectedId,
  (entities, id) => entities[id]
);

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

Другие вопросы по тегам