问题标签 [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.

0 投票
1 回答
43 浏览

typescript - 在ngrx实体中请告诉我什么类型处于实体状态

我只是将上面的内容作为代码放入,以便 V 部分显示出来......(而且我不知道如何搜索包含在人字形中的东西或这些东西被称为)

我已经搜索了我能想到的一切。ngrx 文档在https://v7.ngrx.io/guide/entity/interfaces的文档中使用它,我发现本教程提到了它 - https://medium.com/ngrx/introducing-ngrx-entity-598176456e15

这是它使用的接口:

0 投票
0 回答
641 浏览

angular - Reducer 的 @ngrx/entity EntityAdapter 函数不会更改存储状态

所以我有一个自定义实体,我将在 UI 中添加它:

会议.ts:

我使用新的创建者语法搭建了@ngrx/entity:

会议.actions.ts:

以及相应的减速机

会议.reducer.ts

我将调度一个beginAddMeeting动作,触发一个存储到后端的效果。这会正确发生,并且效果也正确地addMeeting使用正确的有效负载分派操作,我可以在 DevTools 中验证这一点。但是,状态没有改变,实体也没有被添加到商店,所以我所有的容器都没有注意到变化。

奇怪的是,当我 dispatchbeginLoadMeetings触发类似效果时,只从后端获取所有实体,商店得到正确更新。总之,addMany工作,addOneupsertOne国家无能为力。当我在没有适配器的情况下进行更新时,reducer 甚至没有反应,这让我怀疑我的配置有问题。花了半个星期解决这个问题,但没有成功,所以我希望我能在这里找到一些帮助。谢谢!

0 投票
1 回答
183 浏览

angular - NGRX Entity addOne 替换当前状态的对象

我正在尝试执行插入操作,我正在关注这篇文章 https://angularfirebase.com/lessons/ngrx-entity-feature-modules-tutorial/

不幸的是,不是将新对象添加到当前状态,而是将前一个对象替换为新对象。有人可以帮我弄这个吗?

在此处输入图像描述

Gif 以上实际代码的当前行为。

动作文件:

减速器文件:

0 投票
1 回答
589 浏览

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 词典的更改有关,但我不知道为什么。字典值现在可以是未定义的。

在此处输入图像描述

0 投票
0 回答
160 浏览

angular - NgRx Entity 基于属性过滤状态

我需要在我的减速器中删除选定的“档案”。有没有办法过滤当前状态?我找到了以下解决方案,但我认为应该有更好的方法来做到这一点。

0 投票
0 回答
191 浏览

angular - @ngrx/entity 如何更新多个级别的项目

假设我有一个如下所示的状态切片:

我将如何在我的减速器中更新该答案,我想我可以使用类似以下的东西,但是当我试图深入研究问题然后回答时,我会遇到各种各样的问题。

现在,我知道这可能应该以某种方式标准化,通常我会,但是,这不是现阶段的选择。

0 投票
1 回答
356 浏览

lodash - 为什么深度克隆我的状态会导致ngrx进入无限循环,不断调用我的reducer?

我们有以下 ngrx 减速器,但在我们的状态(结构:)中添加了一个嵌套对象settings: { a: boolean, b: string },因此决定使用 lodashcloneDeep(obj)而不是...obj扩展运算符来确保我们的状态是不可变的,根据官方文档“创建减速器功能”</a>部分:

扩展运算符只进行浅层复制,不处理深度嵌套的对象。您需要复制对象中的每个级别以确保不变性。有一些库可以处理深度复制,包括lodashimmer

当我们将其更改为以下内容时,ngrx 继续调用该reducer()方法,有效地阻止(崩溃)浏览器:

stateChange甚至没有触及新嵌套的附加状态属性(即settings对象),只有prop1, prop2我们之前拥有的平面属性 ( )。settings然而,它是 lodash 的一部分,oldState因此传递给 lodash 的cloneDeep().

知道为什么更改返回的状态(即使用_.deepClone(state)而不是扩展...state运算符)会产生这种效果 - 以及如何阻止它?

我们正在使用@ngrx/entity,所以状态正在扩展EntityState<MyState>。我不理解库的实体函数返回一个新状态(或“如果没有进行任何更改,则返回相同的状态”),并且可以将其他属性(如我们的新嵌套settings对象)添加到该状态,但
“[t]这些属性必须是手动更新”——我认为这意味着我必须自己克隆它们。

我们试图克隆整个状态(扩展EntityState<T>)的错误,而不仅仅是附加属性

工作代码和损坏代码之间的唯一更改是在reducer()方法中进行的,所以我认为我们不会意外触发我们之前没有触发的任何新事件,这通常会导致无限循环......

0 投票
1 回答
168 浏览

angular - 如何在 NGRX 中创建 EntityState 集合

State是否可以像下面这样创建一个NGRX

我创建了创建动态EntityState但无法完全实现它。

问题:建模这样的替代方法是store什么?

得到了在这里创建多个实体的例子,这里是预定义的,但不是动态的。

0 投票
3 回答
3854 浏览

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库一样)规范化深层嵌套数据。

0 投票
1 回答
1141 浏览

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}));