问题标签 [ngrx-entity]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
typescript - 在ngrx实体中请告诉我什么类型处于实体状态
我只是将上面的内容作为代码放入,以便 V 部分显示出来......(而且我不知道如何搜索包含在人字形中的东西或这些东西被称为)
我已经搜索了我能想到的一切。ngrx 文档在https://v7.ngrx.io/guide/entity/interfaces的文档中使用它,我发现本教程提到了它 - https://medium.com/ngrx/introducing-ngrx-entity-598176456e15
这是它使用的接口:
angular - Reducer 的 @ngrx/entity EntityAdapter 函数不会更改存储状态
所以我有一个自定义实体,我将在 UI 中添加它:
会议.ts:
我使用新的创建者语法搭建了@ngrx/entity:
会议.actions.ts:
以及相应的减速机
会议.reducer.ts
我将调度一个beginAddMeeting
动作,触发一个存储到后端的效果。这会正确发生,并且效果也正确地addMeeting
使用正确的有效负载分派操作,我可以在 DevTools 中验证这一点。但是,状态没有改变,实体也没有被添加到商店,所以我所有的容器都没有注意到变化。
奇怪的是,当我 dispatchbeginLoadMeetings
触发类似效果时,只从后端获取所有实体,商店得到正确更新。总之,addMany
工作,addOne
对upsertOne
国家无能为力。当我在没有适配器的情况下进行更新时,reducer 甚至没有反应,这让我怀疑我的配置有问题。花了半个星期解决这个问题,但没有成功,所以我希望我能在这里找到一些帮助。谢谢!
angular - NGRX Entity addOne 替换当前状态的对象
我正在尝试执行插入操作,我正在关注这篇文章 https://angularfirebase.com/lessons/ngrx-entity-feature-modules-tutorial/
不幸的是,不是将新对象添加到当前状态,而是将前一个对象替换为新对象。有人可以帮我弄这个吗?
Gif 以上实际代码的当前行为。
动作文件:
减速器文件:
angular - 断言 NGRX 字典值已定义
我刚刚从 Angular 7.1.4 升级到 8.2.0,Typescript 3.1.6 到 3.5.3,RxJS
在升级之前,TS 正确地识别出这个数组项不是未定义的,但现在我得到了这个令人沮丧的编译错误。(注意,我在下面使用 lo-dash,但是如果我使用,也会出现同样的错误if (autoCorrectionData[action.algorithmId] !== undefined) {
src/app/state/edit/edit.reducer.ts(417,29): error TS2532: Object is possibly 'undefined'.
在使用条件检查后,如何让 TypeScript 识别出对象已定义if
?
*编辑* 这可能与最近对 NGRX 词典的更改有关,但我不知道为什么。字典值现在可以是未定义的。
angular - NgRx Entity 基于属性过滤状态
我需要在我的减速器中删除选定的“档案”。有没有办法过滤当前状态?我找到了以下解决方案,但我认为应该有更好的方法来做到这一点。
angular - @ngrx/entity 如何更新多个级别的项目
假设我有一个如下所示的状态切片:
我将如何在我的减速器中更新该答案,我想我可以使用类似以下的东西,但是当我试图深入研究问题然后回答时,我会遇到各种各样的问题。
现在,我知道这可能应该以某种方式标准化,通常我会,但是,这不是现阶段的选择。
lodash - 为什么深度克隆我的状态会导致ngrx进入无限循环,不断调用我的reducer?
我们有以下 ngrx 减速器,但在我们的状态(结构:)中添加了一个嵌套对象settings: { a: boolean, b: string }
,因此决定使用 lodashcloneDeep(obj)
而不是...obj
扩展运算符来确保我们的状态是不可变的,根据官方文档“创建减速器功能”</a>部分:
扩展运算符只进行浅层复制,不处理深度嵌套的对象。您需要复制对象中的每个级别以确保不变性。有一些库可以处理深度复制,包括lodash和immer。
当我们将其更改为以下内容时,ngrx 继续调用该reducer()
方法,有效地阻止(崩溃)浏览器:
stateChange
甚至没有触及新嵌套的附加状态属性(即settings
对象),只有prop1, prop2
我们之前拥有的平面属性 ( )。settings
然而,它是 lodash 的一部分,oldState
因此传递给 lodash 的cloneDeep()
.
知道为什么更改返回的状态(即使用_.deepClone(state)
而不是扩展...state
运算符)会产生这种效果 - 以及如何阻止它?
我们正在使用@ngrx/entity
,所以状态正在扩展EntityState<MyState>
。我不理解库的实体函数返回一个新状态(或“如果没有进行任何更改,则返回相同的状态”),并且可以将其他属性(如我们的新嵌套settings
对象)添加到该状态,但
“[t]这些属性必须是手动更新”——我认为这意味着我必须自己克隆它们。
我们试图克隆整个状态(扩展EntityState<T>
)的错误,而不仅仅是附加属性?
工作代码和损坏代码之间的唯一更改是在reducer()
方法中进行的,所以我认为我们不会意外触发我们之前没有触发的任何新事件,这通常会导致无限循环......
normalization - 如何使用 ngrx/entity(EntityState 和 EntityAdapter)规范化深度嵌套的数据
我希望对来自我的服务器的数据进行规范化,以便我可以更轻松地与 ngrx/entity 一起使用它。
我喜欢ngrx/entity 如何通过提供EntityState 接口和EntityAdapter 来降低reducers 和其他东西的复杂性。但是我发现它不适用于嵌套数据。
我有 3 个级别的数据:
训练 -> 练习 -> 套装
如果我将它与经典的 ngrx/entity 模式一起使用,当我使用嵌套数据时,它会很快变得拥挤。
下面是我在使用 ngrx/entity 时遇到的第一件事 在那之后我窥探并进入了 normalizr 库 ,我喜欢 normalizr 如何规范化我的数据,并且还用只有 id 作为其他实体(练习、集合)的键替换嵌套数组值
我首先尝试的是像这样组合多个实体状态: 但这需要更改我的服务器以及大量的逻辑和努力。
我想要以某种方式将 normalizr 与 ngrx/entity 结合起来。获得 normalizr 给我的同样的东西,但可以自由地使用来自ngrx/entity的实体适配器api,它是选择器和其他来自ngrx/entity为我服务的代码
所以底线我的问题是如何在没有某种服务器工作的情况下使用ngrx/entity(就像normalizr库一样)规范化深层嵌套数据。
angular - 使用道具过滤 createSelector ngrx
我正在尝试创建一个简单的选择器来通过 a 获取商店中的所有消息visitor_id
,但是,看起来如此简单的事情在 ngrx 中实现总是具有挑战性。
我正在使用ngrx实体,所以我已经selectAll
准备好选择器,所以我尝试执行以下操作:
在组件中:
不过我要Property 'filter' does not exist on type 'unknown'
进去了selectMessageByVisitorId
。我很确定我没有遵循正确的方法。我要做的很简单,将 a 传递visitor id
给选择selectMessageByVisitorId
器,它会返回特征存储中的消息列表,由visitor_id
.
更新#1
根据@Nikhil 的建议,我将选择器更改为:
但是我得到了Property 'filter' does not exist on type 'Observable<Message[]>
,虽然我导入了事件import { filter} from 'rxjs/operators';
(我使用 ngrx 8.0)。
所以我想尝试:
但现在我进入Type 'Observable<Observable<Message[]>>' is not assignable to type 'Observable<Message[]>'.
了组件文件this.messages$ = this.store.select(selectMessageByVisitorId({ visitor_id: visitor.id}));