Javascript 角度6+;不使用操作更新Ngrx状态值
我有一个简单的状态:Javascript 角度6+;不使用操作更新Ngrx状态值,javascript,angular,typescript,rxjs,ngrx,Javascript,Angular,Typescript,Rxjs,Ngrx,我有一个简单的状态: export interface ItemsState{ items: Item[], otherItem: OtherItem, } const initialState: ItemsState= { items: [], otherItem: {} as OtherItem, } 和选择器: const getItemFeatureState = createFeatureSelector<ItemsState>('items'); e
export interface ItemsState{
items: Item[],
otherItem: OtherItem,
}
const initialState: ItemsState= {
items: [],
otherItem: {} as OtherItem,
}
和选择器:
const getItemFeatureState = createFeatureSelector<ItemsState>('items');
export const getItemValue= createSelector(
getItemFeatureState,
state => state.otherItem,
);
public item: Item = {} as Item;
constructor(private itemsStore: Store<fromItem.State>) {
this.itemsStore.pipe(
select(fromItem.getItemValue),
distinctUntilChanged(),
).subscribe(item=> this.item = item);
}
此.item.value
将在ItemsState中更新,而不使用任何操作
这怎么可能呢?这是因为项目共享相同的引用。如果您对其进行更新,商店中的商品也将更新
这不是你想要的。要在开发过程中发现这些“错误”,您可以使用包来防止这种情况。这是因为该项共享相同的引用。如果您对其进行更新,商店中的商品也将更新
这不是你想要的。为了在开发过程中发现这些“错误”,您可以使用软件包来防止这种情况。我想说的是相同的内存引用,但我对库的了解还不够,无法告诉您这一点。你可以试试
.subscribe(item=>this.item={…item})
来确定一下吗?我想说的是相同的内存引用,但我对库的了解还不够,不能告诉你。你可以试试.subscribe(item=>this.item={…item})
来确定一下吗?好的,我知道这是一种不好的做法,所以我必须纠正它。在您的建议中,什么是只更新处于状态的复杂对象的一部分而不必通过操作传递整个对象的最佳方法?他们唯一的方法是通过操作,并在减速器中进行更改。如果你的状态很复杂,也许伊默可以让这更容易。好的,我知道这是一个坏习惯,所以我必须纠正它。在您的建议中,什么是只更新处于状态的复杂对象的一部分而不必通过操作传递整个对象的最佳方法?他们唯一的方法是通过操作,并在减速器中进行更改。如果你的状态很复杂,也许伊默可以让这更容易。
this.item.value = someValue;