我的规范化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应该只对其中的项目执行,即由cart 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
}
})
}
});
这个选择器不会计算过多,但是我需要所有的推车,而且我不确定它是否可以用选择器完成。
发布于 2019-01-03 06:52:34
由于状态已经更改,选择器将重新计算.。
但是,您可以使用为cart和保留另一个状态来实现,当您分派addCart项操作时,您可以使用单个项来更新购物车,而不是使用选择器。
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;
}
https://stackoverflow.com/questions/54024066
复制相似问题