我正在尝试使用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的实体模块存储)。这些实体有点明显:项目,问题,董事会。
我遇到的问题是找到在我的商店中存储实体的最佳方法,特别是因为它们在我的不同模块之间共享。例如:
这些实体应该存储在功能模块级别还是存储在根存储级别?
如果我将它们存储在功能级别,它可能如下所示:
{
"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效果(位于问题功能文件夹中)将必须从theDashboard.loadIssues,fromProject.loadIssues和fromBoard.loadIssues中听取。它看起来很奇怪,因为我觉得不喜欢问题功能应该知道仪表板/项目/板。
另一种方法是将其存储在根级别,例如:
{
"entities": {
"projectEntities": {
// ...
},
"boardEntities": {
// ...
},
"issueEntities": {
// ...
}
},
"board": {
// ...
},
"projects": {
// ...
},
"issues": {
// ...
}
}
实体行动和减速器将位于core
模块中。减少器和效果仍然必须监听多个动作(例如fromDashboard.loadIssues,fromProject.loadIssues和fromBoard.loadIssues),但对我来说,如果核心知道所有功能(毕竟它是核心的应用程序)。
但它在某种程度上感觉不对,或者至少在我看来它看起来不像标准的ngrx方式,但我可能错了。
谢谢你的帮助。
从我读到的,实体构成了整个应用程序,并且在每个模块中都需要。对于这种情况,我认为在根部添加它们是完全合理的。
我在Sharing data between modules is peanuts.写了一篇关于这个主题的文章