Как выбрать один элемент / сущность, 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
соответствующие селекторы доступны там, где они необходимы.