我正在尝试使用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效果(位于问题功能文件夹中)将不得不收听fromDashboard.loadIssues,fromProject.loadIssues和fromBoard.loadIssues。这看起来很奇怪,因为我不喜欢发布功能应注意仪表板/项目/板。
另一种方法是将其存储在根级别,例如:
{
"entities": {
"projectEntities": {
// ...
},
"boardEntities": {
// ...
},
"issueEntities": {
// ...
}
},
"board": {
// ...
},
"projects": {
// ...
},
"issues": {
// ...
}
}
将在core
模块中放置实体动作和归约器的位置。减速器和效果器仍将不得不侦听多个动作(例如fromDashboard.loadIssues,fromProject.loadIssues和fromBoard.loadIssues),但对我而言,如果核心知道所有功能(毕竟它是核心)是可以的该应用程序。)
但是它某种程度上感觉不对,或者至少对我来说,它看起来不像标准的ngrx方式,但是我可能是错的。
感谢您的帮助。
答案 0 :(得分:0)
据我了解,实体构成了整个应用程序,每个模块都需要这些实体。对于这种情况,我认为将它们添加到根目录是很有意义的。
中写了一些有关该主题的文章