angular - Angular/NGRX:实体和全选的奇怪行为?
问题描述
seletAll
从getSelectors()
触发事件而不更改为自己的功能存储,但是当根存储更改时。
打开演示并单击按钮。该按钮将更改发送到根存储,但功能存储中的 selectAll 也会触发该事件:
仅当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 错误还是我做错了什么?
解决方案
推荐阅读
- javascript - 当表单保存在php中时检查数据库中的表
- php - 像在文件资源管理器中一样获取文件夹和文件
- laravel - 使用 Bulma 无法解析 id Laravel 的输入模态
- sql - SQL:如果有两行包含相同的记录,希望它显示一个
- python - 网站在找到的目录中返回响应 200
- javascript - React Component 没有显示不同的文本/信息,尽管被赋予了唯一的对象作为传递的道具
- nestjs - nestjs tyoeorm 中 2 个存储库之间的事务
- python - 如何编写允许变量通过的 Peewee 查询
- oauth - OAuth 实施 - 撤销访问令牌
- node.js - Typescript Mongoose 以类型安全的方式忽略查询结果中的某些字段