问题简史:
我正在为派对游戏黑手党开发网络助理,所以目标是在NGXS中存储单个游戏。这是gitlab回购
游戏包含:
每一天有三个阶段:夜晚>白天>投票
为了维护这个复杂的日间结构,并记录所有玩家的动作,我需要大量的动作,所以当GameState开始变得庞大时,我尝试将它分解为子状态。在这里,我遇到了循环依赖问题。
事实上,我已经设法解决了它,通过阅读这个:https://github.com/ngxs/store/issues/632
我将CurrentDayState和PlayersState创建为子状态,但在本例中,这似乎是一种糟糕的方法,因为这样:
GameState中的days数组中,如果游戏主机需要检查一些信息,就很难实现返回到前几天。我觉得我的方法有点笨重,我想不出更好的解决方案。我可以将所有的操作存储在根GameState中,但是这样的话,.ts文件将占用大约800行代码,这对我来说似乎是个坏主意。
问题:
是否有任何方法使NGXS状态模块化,但让它的每个部分访问来自另一个部分的选择器,而不会遇到循环依赖问题?(阅读已经意味着问题,NGXS子州应该是相互独立的,不应该相互控制。)
发布于 2020-05-01 14:00:03
解决这一问题的一种方法是将每个存储视为数据库表,将写入的每个新状态作为表中的新记录/行。正常化你的模型,你可以有一个播放器商店和一天商店。如果您需要某一天的整个天数和player状态的历史记录,则可以连续插入新的状态,而不是更新当前状态。玩家可能需要一个属性来指示给定状态的时间(比如指向关联的日期状态的外键)。
如果这是业务需求,则可以编写选择器,以获取游戏历史上给定时间内的当前状态或查找给定状态。关于选择器的ngxs文档提到将不相关的状态与元选择器连接起来。您可以考虑使用这些选择器将相关的player和day连接到一起,以满足给定的查找需求。
编辑1:规范数据和存储快照解决了您提到的具有完整游戏历史和维护更多管理状态的双重问题。
对于在不依赖循环的情况下维护不同状态的具体问题,您应该避免将两个文件相互导入。有两种方法可以从我的头顶上解决这个问题:
然后,使用NGXS提供的并加入相关的州.
eg.
export class DaysState{
@Selector([DaysState, PlayersState])
static getGameState(days, players) {
return [...days, ...players];
}
}https://stackoverflow.com/questions/61543092
复制相似问题