Angular 带过滤器的ngrx createSelector

Angular 带过滤器的ngrx createSelector,angular,ngrx,ngrx-store,Angular,Ngrx,Ngrx Store,我有一个选择器,用于获取当前选定项: const getSelectedItem = createSelector( getItemId, getItemsById, (itemId: string, itemsById: Record<string, Item>) => itemsById[itemId], ); 但我有许多组件依赖于相同的逻辑。如何在我的getSelectedItem中封装过滤器(布尔值)?这是我见过的最接近的一次,但有时它仍然发出false:

我有一个选择器,用于获取当前选定项:

const getSelectedItem = createSelector(
  getItemId,
  getItemsById,
  (itemId: string, itemsById: Record<string, Item>) => itemsById[itemId],
);
但我有许多组件依赖于相同的逻辑。如何在我的
getSelectedItem
中封装
过滤器(布尔值)
?这是我见过的最接近的一次,但有时它仍然发出
false

getSelectedItem = createSelector(
  getItemId,
  getItemsById,
  (itemId: string, itemsById: Record<string, Item>) => !!itemsById[itemId] && itemsById[itemId],
);

我想出了一些可行的办法:

getSelectedItemRaw = createSelector(
  getItemId,
  getItemsById,
  (itemId: string, itemsById: Record<string, Item>) => itemsById[itemId],
);

getSelectedItem = createSelector(
  select(state => getSelectedItemRaw(state)),
  filter<Item>(Boolean),
);
getSelectedItemRaw=createSelector(
getItemId,
getItemsById,
(itemId:string,itemsById:Record)=>itemsById[itemId],
);
getSelectedItem=createSelector(
选择(state=>getSelectedItemRaw(state)),
过滤器(布尔),
);

getSelectedItem
的类型是
MemoizedSelector
,因此它需要在effects/components中与
this.store.pipe(getSelectedItem)
一起使用。坏消息是测试很麻烦,我只能通过设置
getSelectedItemRaw
的值来测试,你能添加你的
reducer
代码吗?最初认为
itemsById
应处于状态,并在减速器中进行过滤
getSelectedItem = createSelector(
  getItemId,
  getItemsById,
  (itemId: string, itemsById: Record<string, Item>) => itemsById[itemId],
  filter(Boolean),
);
getSelectedItemRaw = createSelector(
  getItemId,
  getItemsById,
  (itemId: string, itemsById: Record<string, Item>) => itemsById[itemId],
);

getSelectedItem = createSelector(
  select(state => getSelectedItemRaw(state)),
  filter<Item>(Boolean),
);