首页 > 解决方案 > 使用 ngrx 处理复杂模型

问题描述

我有兴趣在我的应用程序中实现 ngrx 框架,但我对真正涉及的工作量有些担心。这是我正在使用的模型,您可以看到公会模型本质上只是玩家的集合。我有建立公会的计划,但现在还很空洞。Player Model由一些属性和一组 Skills 组成,每个 Skill 都有 SkillRule。

{
    GuildName: "Guild",
    Players:[{
        PlayerName: "Player A",
        PlayerId: 1, 
        AttackType: "Melee",
        Skills:[{
            SkillName: "Heal Self", 
            SkillType: "Magic", 
            SkillRules:{
                RuleType:"HealRule",
                Cost: 100,
                FailChance:10
                Boost: false
            }
        }]
    }]
}

{
    PlayerName: "Player A",
    PlayerId: 1, 
    AttackType: "Melee",
    Skills:[{
        SkillName: "Heal Self", 
        SkillType: "Magic", 
        SkillRules:{
            RuleType:"HealRule",
            Cost: 100,
            FailChance:10
            Boost: false
        }
    }]
}

这些值都是通过各种 UI 元素设置的,例如文本字段、下拉菜单、单选按钮等。

我感兴趣的是利用 NGRX 来管理公会状态和玩家状态。两者在应用程序中被分开处理,因为玩家可以被认为是“单人”;公会 [] 和玩家 []。

我的问题是(希望这是有道理的),状态管理需要涉及到这些模型的深度吗?例如,我是否需要动作/选择器/效果让用户与所有不同的属性进行交互?如果用户想要更新玩家的 AttackType 或 SkillRules,是否需要动作/效果?

我的想法是使用商店来管理顶层的两个集合,我的组件将从商店中获取对象并将它们呈现给用户。我可能至少需要对 UPDATE_GUILD 和 UPDATE_PLAYER 采取行动。

标签: angularangular7ngrxstate-management

解决方案


准确地说,您需要 NgRx 中的 Effects 来更改请求的异步部分,您希望在对存储进行最终更改之前处理来自服务器的一些数据。

你的问题:

例如,我是否需要动作/选择器/效果让用户与所有不同的属性进行交互?

答案不一定适用于所有人。您肯定需要 Actions 来调用 Reducer,这将改变您的应用程序 同步数据,例如,如果您更改了单击链接上的路由,这是一个简单的案例,不需要 Effect,只需 Reducer 就可以了.

但是在这两种情况下,您都需要使用 Action 来调度调用并执行该操作。

需要选择器来回读值,因此如果您需要读取值,则必须为其创建选择器。如果您不需要价值,请不要创造价值。

如果您有一个操作,例如 getUserAccount 信息,它是异步请求的操作,则需要效果,一旦在效果中处理了该信息,那么效果将向 Reducer 分派一个操作,以将从服务器接收到的最终响应提交到状态。

解决方案是您需要了解进行状态更改的确切要求,并确定请求是同步的还是异步的。


推荐阅读