Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 将NGXS状态分解为更小的可维护部分,但使它们彼此可访问的最佳方法是什么?_Angular_Typescript_Ionic4_Ngxs - Fatal编程技术网

Angular 将NGXS状态分解为更小的可维护部分,但使它们彼此可访问的最佳方法是什么?

Angular 将NGXS状态分解为更小的可维护部分,但使它们彼此可访问的最佳方法是什么?,angular,typescript,ionic4,ngxs,Angular,Typescript,Ionic4,Ngxs,问题简史: 我正在为开发web助手,所以目标是在NGXS中存储单个游戏。这是 游戏内容包括: 球员名单 过去的天数列表(从0到大约5天(通常)) 每天有三个阶段:晚上>白天>投票 为了维持这个复杂的日结构并记录所有玩家的动作,我需要大量的动作,所以当GameState开始变得庞大时,我尝试将其分解为子状态。在这里,我遇到了循环依赖问题 事实上,通过阅读以下内容,我设法解决了这个问题: 我创建了CurrentDayState和PlayersState作为子状态,但在这种情况下,这似乎是一种不好

问题简史:

我正在为开发web助手,所以目标是在NGXS中存储单个游戏。这是

游戏内容包括:

  • 球员名单
  • 过去的天数列表(从0到大约5天(通常))
  • 每天有三个阶段:晚上>白天>投票

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

    事实上,通过阅读以下内容,我设法解决了这个问题:

    我创建了
    CurrentDayState
    PlayersState
    作为子状态,但在这种情况下,这似乎是一种不好的方法,因为这样:

    • 我只能直接访问状态,此时仍然无法访问具有复杂逻辑的选择器
    • 我只存储当前日期和当前投票,然后在
      GameState
      中将它们放入days数组中,如果游戏主机需要检查一些信息,则很难实现返回到前几天
    我觉得我的方法有点笨拙,我无法想出更好的解决方案。我可以在root
    GameState
    中存储所有操作,但这样.ts文件将占用大约800行,对我来说这似乎是个坏主意


    问题:

    有没有办法使NGXS状态模块化,但让它的每个部分都从另一个部分访问选择器,而不会遇到循环依赖问题?
    (阅读已经意味着问题,NGXS子状态应该是相互独立的,并且不应该相互控制)

    < P>一种方法是将每个存储区看作数据库表和每个新的状态作为表中的新记录/行写入。规范化你的模型,你可以有一个播放器商店和一个日间商店。如果您需要某一天的天数和玩家状态的整个历史记录,您可以不断插入新状态,而不是更新当前状态。玩家可能需要一个属性来指示给定状态的时间(比如指向关联的日状态的外键)

    如果这是一项业务需求,则可以编写选择器以获取当前状态或查找游戏历史中给定时间内的给定状态。关于选择器的ngxs文档提到将不相关的状态加入到选择器中。您可以考虑使用这些选择器将相关的播放器和日间状态一起加入给定的查找需求。

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

    对于在没有循环依赖的情况下维护不同状态的特定问题,应该避免将两个文件相互导入。有两种方法可以在我脑海中处理这个问题:

    > P>考虑您需要哪些州加入-选择一个作为主要业务对象的基础,并且只将文件导入到该状态中。p> < L>>P>如果两个状态都不是基本业务对象的基础,那么引入一个第三态来服务这个角色并将其他状态导入到这个。

    然后,使用NGXS提供的元选择器并在那里加入相关的状态

    例如

    export class DaysState{
      @Selector([DaysState, PlayersState])
      static getGameState(days, players) {
        return [...days, ...players];
      }
    }
    

    谢谢你的回答!为历史存储快照似乎是个好主意,但我并没有真正了解规范化模型如何帮助我解决循环依赖性问题。