首页 > 解决方案 > Angular/NGRX:实体和全选的奇怪行为?

问题描述

seletAllgetSelectors()触发事件而不更改为自己的功能存储,但是当根存储更改时。

打开演示并单击按钮。该按钮将更改发送到根存储,但功能存储中的 selectAll 也会触发该事件:

https://stackblitz.com/edit/angular-ngrx-test-123654789-a7js8p?file=src%2Fapp%2Ffeatures%2Fbar.component.ts

在此处输入图像描述

仅当seletAll用于接受道具作为参数的其他选择器时才会发生此行为。

仅当更改进入功能存储时,seletAll 才应触发事件。

这是选择器:

export const selectBarStore = createFeatureSelector<State>('barStore');

export const selectBarState = createSelector(
  selectBarStore,
  (state: State) => state ? state.bar : null
);

export const { selectEntities, selectAll } = adapter.getSelectors(selectBarState);

export const selectBarById = createSelector(
  selectAll,
  (itemEntities: Bar[], props: {id: number}) =>
  itemEntities ? itemEntities.filter(element => element.id === props.id) : []
);

更新 1

我还在ngrx github https://github.com/ngrx/platform/issues/2707上打开了一个问题

一位 ngrx 开发人员说

我不确定这是否是一个错误,如果是一个错误,如何修复它。根本原因是 props 选择器,它共享同一个 selectAll 实例(因为它将 props 传递给 selectAll)。

更新 2

解决方法是使选择器成为工厂并且不要传递 props 参数:

export const selectBarById = createSelector(
  selectAll,
  (itemEntities: Bar[], props: {id: number}) =>
  itemEntities ? itemEntities.filter(element => element.id === props.id) : []
);

export const selectBarById = (id: number) => createSelector(
  selectAll,
  (itemEntities: Bar[]) =>
  itemEntities ? itemEntities.filter(element => element.id === id) : []
);

主要问题是:这是一个 NGRX 错误还是我做错了什么?

标签: angulartypescriptngrxngrx-storengrx-entity

解决方案


推荐阅读