我正在尝试使用 ngrx 构建应用程序。例如,假设这是一个项目管理应用程序(例如 Jira)。要求说它应该使用ngrx构建。
在此应用程序中,我确定了以下功能:
- 板(看板列表)
- 项目管理
- 问题管理
- 仪表板(所有功能/项目/板/设置/其他的概述)
所以我的文件夹结构可能如下所示:
- board (feature module)
- core
- dashboard (feature module)
- issue (feature module)
- project (feature module)
- shared
- app.component.ts
- app-routing.module.ts
- app.module.ts
我还有一组实体(使用 ngrx 的实体模块存储)。这些实体有点明显:项目、问题、董事会。
我遇到的麻烦是找到将实体存储在我的商店中的最佳方式,特别是因为它们在我的不同模块之间共享。例如:
- Dashboard 需要 board、project 和 issue 实体。
- 董事会需要董事会、项目和发行实体。
- 项目需要项目和问题实体。
- 问题需要问题实体。
这些实体应该存储在功能模块级别还是根存储级别?
如果我将它们存储在功能级别,它可能如下所示:
{
"board": {
"boardEntities": {
"0" {
"id": 0,
"projectId": 1,
"name": "My super board",
"configuration": { ... }
}
}
},
"projects": {
"projectEntities": {
"1": {
"id": 1,
"name": "my project",
"issueIds": [0, 1, 2, 3, 4], // all issues of this project
"owner": "owner"
}
}
},
"issues": {
issueEntities: {
"0": {
// ...
}
}
}
}
但是加载部分有点尴尬。例如,当我的仪表板尝试显示问题时,它们可能尚未处于我的状态。我将调度一个类似的动作new fromDashboard.loadIssues()
,这个动作将被一个加载问题的效果捕获,但这个效果存在于问题功能中。因为几乎所有功能都可以加载问题,所以我的 loadIssues 效果(位于问题功能文件夹中)将不得不听 fromDashboard.loadIssues、fromProject.loadIssues 和 fromBoard.loadIssues。它看起来很奇怪,因为我不喜欢问题功能应了解仪表板/项目/板。
另一种方法是将其存储在根级别,例如:
{
"entities": {
"projectEntities": {
// ...
},
"boardEntities": {
// ...
},
"issueEntities": {
// ...
}
},
"board": {
// ...
},
"projects": {
// ...
},
"issues": {
// ...
}
}
实体动作和减速器将位于core
模块中的位置。减速器和效果器仍然需要监听多个动作(例如 fromDashboard.loadIssues、fromProject.loadIssues 和 fromBoard.loadIssues),但对我来说,如果核心知道所有功能(毕竟它是应用程序)。
但不知何故感觉不对,或者至少对我来说它看起来不像标准的ngrx方式,但我可能错了。
谢谢你的帮助。