我的标准化ngrx存储看起来像这样:
export interface State {
carts: EntityState<Cart>;
items: EntityState<Item>;
}
export interface Cart {
id: number;
maxVolume: number;
}
export interface Item {
id: number;
cartId: number;
volume: number;
}
这是一个非常基本的设置,其中购物车可以包含多个物品。 我的选择器需要返回一个数组,其中所有购物车的数组都包含其商品,还需要计算商品是否有可能从各自的购物车中退出:
export const select: MemoizedSelector<object, any> = createSelector(
selectAllCarts, selectAllItems,
(allCarts: Cart[], allItems: Item[]) => {
return allCarts.map(c => {
const items = allItems.filter(i => i.cartId == i.id);
return {
id: c.id,
items: items.map(i => {
// computations, should not run if cart's items have not changed
// needs to be memoized
const computed = isCartOverfilled(i, c, items);
return {
id: i.id,
mightFallOut: computed//computed value needs to be output
}
})
}
});
});
每次商品更新时,都会为商店中的每个商品运行 isCartOverfilled 。但是, isCartOverfilled 可能很昂贵,并且仅取决于购物车中的物品。项目更新时,例如被添加到购物车后, isCartOverfilled 应该对其中的物品执行仅执行,即根据购物车ID进行记录。
我该如何实现?
我尝试从一个购物车中选择商品:
export const selectCart = (cartId: number) => createSelector(
selectItemsByCartId(cartId), selectCartById(cartId),
(items: Item[], cart: Cart) => {
return {
id: cart.id,
items: items.map(i => {
const computed = isCartOverfilled(i, cart, items);
return {
id: i.id,
mightFallOut: computed
}
})
}
});
此选择器不会过多地计算,但是我需要所有购物车,而且不确定使用选择器是否可行。
答案 0 :(得分:0)
状态已更改,选择器将重新计算。
但是您可以实现为购物车保留其他状态,并且在分派addCart Item操作时,您可以使用单个商品更新购物车,而无需使用选择器。
export interface State {
carts: EntityState<Cart>;
cartOverFilled: SomeState or part of Cart State <---
items: EntityState<Item>;
}
或
export interface State {
carts: EntityState<CartState>;
items: EntityState<Item>;
}
export interface CartState {
cart: Cart;
overFilled: any
}
export interface Cart {
id: number;
maxVolume: number;
}