我研究了 NGXS,发现文档很少,对最佳实践的描述甚至更少。
例如,我有一个客户端数据库,通过一些抽象方法将其信息加载到存储库中。我需要获取有关特定客户的信息。如果它已经在存储中,那么一切都清楚了,我就接受它。但是,如果它还没有被加载到那里,反之亦然。如何让客户正确?
我看到了哪些选项?在解析器中执行此操作,然后保证组件在初始化阶段接收数据。直接在组件中执行此操作,但在我看来,以这种方式加载组件是错误的。通过提供存在性检查的服务来执行此操作,如果它们不存在,则通过订阅将数据传递给组件。最后,在商店本身进行,这对我来说似乎很糟糕,因为那样我还必须在那里进行验证和错误处理,这在我看来违反了一堆正确架构的概念。当然还有其他方法。
但是验证方法本身对我来说也不是很明显。我认为首先您需要拍摄商店的快照,发现其中缺少必要的数据,然后将它们分派。有没有更优雅的选择?
建议如何正确地做这件事,也许有一些东西可以阅读以了解这个主题。
免责声明 - 我是 NGXS 开发人员之一,所以我会尝试给出更详细的答案:)
我看到 2 个状态 -
clients,client.有点不清楚,您有一个客户列表,用户可以做什么 - 选择他们并查看信息?您需要在问题中指定,因为例如我不清楚。
是的,创建一个事件:
并将其发送到解析器中:
不需要,组件最初必须通过选择器接收一个现成的数据块:
这是您的主观意见,但事实并非如此。状态应该隔离某些业务逻辑,以便没有人遍历文件并查找发生了什么、在哪里以及如何发生。
它会打破什么概念?:)
为什么每次用户重新加载页面时都要检查一下——他应该看到一个客户列表,对吧?
PS - 在评论中写更详细的问题,我会更新答案。
UPD
如果您破译 SOLID 首字母缩写词并了解所有原则,则不会违反任何原则 :)
您无需进行任何验证。看,你有一个根解析器,Angular 将运行 1 次以获取所有客户端:
当你的架构不是“类 Redux”时,错误处理应该在服务中完成。这不适用于组件,因为有时您需要在那里进行一些处理(在需要向用户显示错误的情况下,例如表单验证)。
当你有状态时,必须在适当的类中进行处理,在 NgRx 中这些是具有效果的类,在 NGXS 中它只是一个具有状态的类。
否则,存在循环依赖:
原则上,我认为错误处理没有问题,例如,我们想加载一个客户端列表,但我们的容器已经下降(假设)并且 Nginx 返回 504:
它在哪里
clientsService.getClients:也许我误解了您的问题-如何加载具有验证功能的客户端等,如果您已经有了它们的列表-那么您是否需要按ID加载客户端,从数组中获取它不是更容易吗?
也许如果客户端列表包含有关它们的不完整信息,但只有一些最小的信息,例如
id, name,那么您可以创建一个附加状态,例如clientsInfo,它将获取所需的客户端id或下载它:public static getClientByIdid是一个选择器,它将通过它的, 或undefined(如果它不存在)从缓存中返回有关客户端的完整信息。然后在解析器中,您需要检查:
在组件本身中,我们已经获得了有关客户端的所有信息: