问题标签 [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 回答
1769 浏览

angular - 使用 ngrx/selector 和 ngrx/entities 接收具有特定键的数组

如何使用选择器仅通过某个键获取数据?

也就是说,我有 4 个菜单,每个菜单都有一个特定catalogCode的 ,用户在单击时从服务器获取特定菜单的列表。此列表的每个元素都有一个id = code + catalogCode. 也就是说,catalogCode这个菜单的所有元素都是相同的。那么如何catalogCode从商店中获取特定商品的列表呢?

我正在尝试这样做selectByCatalogCode

但这在组件中使用时不起作用,总是显示未定义的值

目录项.ts

我只提供了部分代码。如有需要,我可以提供整个店铺的代码。

效果.ts

目录-list.component.ts

0 投票
1 回答
593 浏览

angular - ngrx 实体应该存储在功能级别还是应用级别?

我正在尝试使用 ngrx 构建应用程序。例如,假设这是一个项目管理应用程序(例如 Jira)。要求说它应该使用ngrx构建。

在此应用程序中,我确定了以下功能:

  • 板(看板列表)
  • 项目管理
  • 问题管理
  • 仪表板(所有功能/项目/板/设置/其他的概述)

所以我的文件夹结构可能如下所示:

我还有一组实体(使用 ngrx 的实体模块存储)。这些实体有点明显:项目、问题、董事会。

我遇到的麻烦是找到将实体存储在我的商店中的最佳方式,特别是因为它们在我的不同模块之间共享。例如:

  • Dashboard 需要 board、project 和 issue 实体。
  • 董事会需要董事会、项目和发行实体。
  • 项目需要项目和问题实体。
  • 问题需要问题实体。

这些实体应该存储在功能模块级别还是根存储级别?

如果我将它们存储在功能级别,它可能如下所示:

但是加载部分有点尴尬。例如,当我的仪表板尝试显示问题时,它们可能尚未处于我的状态。我将调度一个类似的动作new fromDashboard.loadIssues(),这个动作将被一个加载问题的效果捕获,但这个效果存在于问题功能中。因为几乎所有功能都可以加载问题,所以我的 loadIssues 效果(位于问题功能文件夹中)将不得不听 fromDashboard.loadIssues、fromProject.loadIssues 和 fromBoard.loadIssues。它看起来很奇怪,因为我不喜欢问题功能应了解仪表板/项目/板。

另一种方法是将其存储在根级别,例如:

实体动作和减速器将位于core模块中的位置。减速器和效果器仍然需要监听多个动作(例如 fromDashboard.loadIssues、fromProject.loadIssues 和 fromBoard.loadIssues),但对我来说,如果核心知道所有功能(毕竟它是应用程序)。

但不知何故感觉不对,或者至少对我来说它看起来不像标准的ngrx方式,但我可能错了。

谢谢你的帮助。

0 投票
3 回答
3872 浏览

ngrx-entity - 当ngrx实体返回未定义的id时如何解决问题

为什么会出现以下错误以及如何解决此问题。

传递给 selectId 实现的实体返回未定义。您可能应该提供自己的 selectId 实现。通过的实体:

0 投票
2 回答
5390 浏览

angular - 使用@ngrx/entity,如何更新项目数组

我正在使用@ngrx/entity,这会创建一个如下所示的状态:

@ngrx/entity确实为我们提供了一些很酷的帮助来更新项目,但似乎(从我在文档中看到的)仅限于更新整个实体。

但是,当用户切换“喜欢”按钮时,我希望在我的减速器中仅state.entities[2].likes使用响应更新该属性。

关于如何解决这个问题的任何想法?

0 投票
1 回答
116 浏览

database - 存储仅包含记录子集的 NGRX 实体

最近制作了一个使用 NGRX 实体进行状态管理的组件,之前我们直接使用了 NGRX action->reducer->effect->selector。

从第一印象开始,在我看来,设计模式希望您将模型中的总记录集加载到状态中,这就是我所做的。然后我开始思考,当这个模型开始包含大量数据时会发生什么。

所以问题是,如果您只将数据子集加载到状态中,实体是否有意义?

例如,如果我只加载一个子集,那么当在商店中作为操作实现时,对该数据的表中的列进行排序就不起作用(正如用户所期望的那样)。

0 投票
1 回答
76 浏览

ngrx - @ngrx/entity 的附加参数

我想将员工数组和页面加载状态保持在商店状态。所以我的初始状态会是这样的

现在我想将@ngrx/entity 用于员工而不是数组。该文档仅显示使用具有整个状态的实体的演示。

如何仅将实体用于一个属性而不是整个状态?

如果不可能,上述情况的替代方案是什么?

0 投票
1 回答
6942 浏览

arrays - “数字”类型的参数不能分配给“数字和字符串”类型的参数

我想Array.prototype.includes在我的 ts 文件中使用方法,例如。

ids数字数组在哪里。我总是得到一个编译错误: Argument of type 'number' is not assignable to parameter of type 'number & string'

当显式将 id 转换为数字Number(id)时,我也看到了Type number is not assignable to type string。当我明确地将 id 转换为字符串时id.toString(),我可以看到Type string is not assignable to type number.

这是压倒性的。如何includes在 TypeScript 中使用方法?如何在我的示例中使用它?

[编辑]扩展示例:

val.ids.includes(selectedId as any)也不起作用。

0 投票
1 回答
19 浏览

ngrx - 一个动作似乎覆盖了另一个不相关的切片

我不太确定如何解释这一点,但这里有一张图片可以帮助解释我似乎面临的问题。

在此处输入图像描述

如您所见,我有 aSharedNotificationsModule和 a SharedConversationsModule,它们彼此完全分开,并且每个都包含自己的状态文件。

我正在将其SharedNotificationsModule导入我SharedHeaderModule的,因为这是大多数与通知相关的内容所在的位置。

但是,如果我导航到ConversationsPage并且LOAD_CONVERSATIONS_SUCCESS被触发,我的前一个notifications切片将被覆盖。

这不仅发生在LOAD_CONVERSATIONS_SUCCESS操作上,也发生在其他页面上,但有时获取用户的操作或获取用户配置文件的操作(导航到用户配置文件页面时)。

我不确定您希望看到什么/如果有任何代码,但请告诉我您想要什么。

0 投票
1 回答
544 浏览

angular - 尽管 DELETE 出错,实体仍从缓存中删除

我正在使用 Angular 8@ngrx/data来管理我的实体。当我启动失败的删除操作(服务器返回 500)时,实体会从 ngrx 客户端缓存中删除,尽管它没有在服务器上被删除。

如何防止实体因错误而从缓存中删除?或者如何在出错时将(非)删除的实体重新添加回缓存?

0 投票
3 回答
3285 浏览

angular - 当在后端定义相关id时,如何为实体适配器定义selectId?

我正在我的商店中调度 upsert 操作/reducer 以向状态添加新记录,并且有一个效果会调用后端并将记录/文档添加到我的 mongodb 实例。

鉴于此特定模型的唯一合理 id 是在创建文档时由我的后端逻辑定义的,我应该如何在前端的实体实现中定义 selectId?

目前,一个项目被添加到状态,id: undefined我收到警告:

entity.js:76 @ngrx/entity:传递给selectId 实现的实体返回未定义。您可能应该提供自己的selectId实现。

我的适配器定义为:

相关的效果是:

publishedData.doi是我需要用来引用实体的违规字段。