首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么是将NGXS状态分解成更小的可维护块的最佳方法,但让它们彼此可以访问?

什么是将NGXS状态分解成更小的可维护块的最佳方法,但让它们彼此可以访问?
EN

Stack Overflow用户
提问于 2020-05-01 13:07:08
回答 1查看 508关注 0票数 2

问题简史:

我正在为派对游戏黑手党开发网络助理,所以目标是在NGXS中存储单个游戏。这是gitlab回购

游戏包含:

  1. 球员名单
  2. 已过的天数列表(从0到大约5天(通常))

玩家模型

每一天有三个阶段:夜晚>白天>投票

日模型

为了维护这个复杂的日间结构,并记录所有玩家的动作,我需要大量的动作,所以当GameState开始变得庞大时,我尝试将它分解为子状态。在这里,我遇到了循环依赖问题。

事实上,我已经设法解决了它,通过阅读这个:https://github.com/ngxs/store/issues/632

我将CurrentDayStatePlayersState创建为子状态,但在本例中,这似乎是一种糟糕的方法,因为这样:

  • 我只能直接访问状态,而具有复杂逻辑的选择器在这一点上仍然无法访问。
  • 我只存储当前和当前的投票,然后将它们推入GameState中的days数组中,如果游戏主机需要检查一些信息,就很难实现返回到前几天。

我觉得我的方法有点笨重,我想不出更好的解决方案。我可以将所有的操作存储在根GameState中,但是这样的话,.ts文件将占用大约800行代码,这对我来说似乎是个坏主意。

问题:

是否有任何方法使NGXS状态模块化,但让它的每个部分访问来自另一个部分的选择器,而不会遇到循环依赖问题?(阅读已经意味着问题,NGXS子州应该是相互独立的,不应该相互控制。)

EN

回答 1

Stack Overflow用户

发布于 2020-05-01 14:00:03

解决这一问题的一种方法是将每个存储视为数据库表,将写入的每个新状态作为表中的新记录/行。正常化你的模型,你可以有一个播放器商店和一天商店。如果您需要某一天的整个天数和player状态的历史记录,则可以连续插入新的状态,而不是更新当前状态。玩家可能需要一个属性来指示给定状态的时间(比如指向关联的日期状态的外键)。

如果这是业务需求,则可以编写选择器,以获取游戏历史上给定时间内的当前状态或查找给定状态。关于选择器的ngxs文档提到将不相关的状态与元选择器连接起来。您可以考虑使用这些选择器将相关的player和day连接到一起,以满足给定的查找需求。

编辑1:规范数据和存储快照解决了您提到的具有完整游戏历史和维护更多管理状态的双重问题。

对于在不依赖循环的情况下维护不同状态的具体问题,您应该避免将两个文件相互导入。有两种方法可以从我的头顶上解决这个问题:

  1. 考虑需要将状态连接到何处--选择一个状态作为主业务对象的基础--并且只以一种方式将文件导入到该状态。
  2. 如果这两种状态都不是主要业务对象的基础,则引入第三种状态来服务于此角色,并将其他状态导入其中。

然后,使用NGXS提供的并加入相关的州.

eg.

代码语言:javascript
复制
export class DaysState{
  @Selector([DaysState, PlayersState])
  static getGameState(days, players) {
    return [...days, ...players];
  }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61543092

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档