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),
);